Pourquoi mon xpath est-il nul? Pourquoi ne trouve-t-il pas les nœuds

.net c# html-agility-pack xml xpath

Question

Je commence à parcourir des documents XML pour apprendre à utiliser xpath.

Je suis tombé sur un problème. Chaque fois que j'essaie d'exécuter mon xpath, il renvoie null comme s'il ne trouvait rien. J'ai essayé le xpath dans XMLQuire et cela a fonctionné là-bas.

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)
            {

            }
        }
    }

J'ai commenté l'autre xpath que j'ai essayé, j'ai essayé ces deux-là et les deux retournent null pourquoi?

Voici une image montrant la partie du DOM à laquelle je veux accéder. entrez la description de l'image ici

<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>

Ma solution (besoin d'aide pour créer mon chemin xpath en une ligne au lieu de parcourir plusieurs boucles.)

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();

J'ai réussi à le réparer, mais je suis curieux de savoir pourquoi ce xpath fonctionne

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

Et celui-ci ne le fait pas. //table[contains(@class,'top-feature')]/tbody/tr/td/a

Réponse populaire

Comme mentionné dans le commentaire, l'élément <tbody> est généré par un outil de développement de navigateur.

Si vous examinez votre objet var DOM pendant l'exécution avec le débogueur, vous pouvez voir la propriété InnerHtml .

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

Aucun élément <tbody> , votre XPath doit donc ressembler à ceci:

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi