なぜ私のxpathはnullですか?なぜそれがノードを見つけられないのですか?

.net c# html-agility-pack xml xpath

質問

私はxpathの使い方を学ぶために、XML文書をたどるだけです。

私は問題に遭遇しました。私はxpathを実行しようとするたびに、何も見つからなかったかのようにnullを返しnull 。 XMLQuireでxpathを試してみました。

class Program
    {
        private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004";
        private static HtmlWeb client = new HtmlWeb();
        static void Main(string[] args)
        {
            var DOM = client.Load(URL); // //table/tbody/tr/td[@class = 'description']/p
            var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tbody/tr/td/a");
            foreach (var Listing in Featured)
            {

            }
        }
    }

私は、私が試した他のxpathをコメントしました、私はそれらの2つを試してみました、そして、どちらもnullを返すのですか?

ここには、アクセスしたいDOMの部分を示すイメージがあります。 ここに画像の説明を入力

class Program
    {
        private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004";
        private static HtmlWeb client = new HtmlWeb();
        static void Main(string[] args)
        {
            var DOM = client.Load(URL); // //table/tbody/tr/td[@class = 'description']/p
            var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tbody/tr/td/a");
            foreach (var Listing in Featured)
            {

            }
        }
    }

私の解決策(私のxpathを1行にするのに役立つ必要があります。

class Program
    {
        private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004";
        private static HtmlWeb client = new HtmlWeb();
        static void Main(string[] args)
        {
            var DOM = client.Load(URL); // //table/tbody/tr/td[@class = 'description']/p
            var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tbody/tr/td/a");
            foreach (var Listing in Featured)
            {

            }
        }
    }

私はそれを修正することができましたが、なぜこのxpathが動作するのか不思議に思っています

class Program
    {
        private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004";
        private static HtmlWeb client = new HtmlWeb();
        static void Main(string[] args)
        {
            var DOM = client.Load(URL); // //table/tbody/tr/td[@class = 'description']/p
            var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tbody/tr/td/a");
            foreach (var Listing in Featured)
            {

            }
        }
    }

そして、この1つdoesnt。 //table[contains(@class,'top-feature')]/tbody/tr/td/a

人気のある回答

コメントで述べたように、 <tbody>要素はブラウザ開発ツールによって生成されます。

デバッガでランタイム中にvar DOMオブジェクトを見ると、 InnerHtmlプロパティを見ることができます。

<table class="regular-ad js-hover" data-ad-id=".." data-vip-url="..">
    <tr>
        <td class="watchlist">
            ...
        </td>    
        <td class="image">
            ...
        </td>
        ...
    </tr>
 </table>

<tbody>要素がないので、XPathは次のようになります。

<table class="regular-ad js-hover" data-ad-id=".." data-vip-url="..">
    <tr>
        <td class="watchlist">
            ...
        </td>    
        <td class="image">
            ...
        </td>
        ...
    </tr>
 </table>



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ