Почему мой xpath null? Почему он не находит узлы

.net c# html-agility-pack xml xpath

Вопрос

Я просто просматриваю XML-документы, чтобы узнать, как использовать xpath.

Я наткнулся на проблему. Каждый раз, когда я пытаюсь выполнить свой xpath, он возвращает null как будто он ничего не нашел. Я пробовал xpath в XMLQuire, и он работал там.

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, которую я пробовал, я пробовал эти два, и оба возвращают null почему это так?

Вот изображение, показывающее часть DOM, к которой я хочу получить доступ. введите описание изображения здесь

<table class="top-feature          js-hover" data-ad-id="1299717863" data-vip-url="/v-renovation-contracting-handyman/sudbury/c-l-contracting-any-job-big-or-small/1299717863">
    <tbody><tr>
        <td class="watchlist">
            <div class="watch js-hover p-vap-lnk-actn-addwtch" data-action="add" data-adid="1299717863" title="Click to add to My Favourites"><div class="icon"></div></div>
                    <input id="watchlistXsrf" name="ca.kijiji.xsrf.token" value="1527418405414.9b71d1309fdd8a315258ea5a3dac1a09e4a99ec7f32041df88307c46e26a5b1b" type="hidden">
</td>

        <td class="image">
            <div class="multiple-images"><img src="https://i.ebayimg.com/00/s/NjAwWDgwMA==/z/fXEAAOSwaZdZxTv~/$_2.JPG" alt="C.L. Contracting. Any job big or small."></div>
                        </td>
        <td class="description">
            <a href="/v-renovation-contracting-handyman/sudbury/c-l-contracting-any-job-big-or-small/1299717863" class="title ">
                C.L. Contracting. Any job big or small.</a>

            <p>
                Contractor handyman home renovations and repairs. Contractor for Dollarama, Rexall, LaSenza and more. Fully licensed and insured. Able to do drywall, decks, framing, plumbing, flooring windows, ...</p>

            <p class="details">
                </p>
        </td>
        <td class="posted">
            </td>
    </tr>
    </tbody></table>

Мое решение (нужно помочь сделать мой xpath в 1 строку вместо того, чтобы пройти через кучу циклов).

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 table in DOM.DocumentNode.SelectNodes("//table[contains(@class, 'top-feature')]"))
            {
                Console.WriteLine($"Found: {table}");
                foreach (var rows in table.SelectNodes("tr"))
                {
                    Console.WriteLine(rows);

                    foreach (var cell in rows.SelectNodes("td[@class='description']/a"))
                    {
                    Console.WriteLine(cell.InnerText.Trim());

                    }
                }
            }

            Console.ReadKey();

Мне удалось это исправить, однако мне до сих пор интересно, почему этот xpath работает

//table[contains(@class, 'top-feature')]/tr/td[@class='description']/a

И этот не делает. //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>

No <tbody> поэтому ваш XPath должен выглядеть так:

DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tr/td/a");


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему