Traverse DOM avec HTML Agility Pack

.net asp.net c# html html-agility-pack

Question

J'analyse un DOM HTML en C # avec la bibliothèque HTMLAgilityPack et je voudrais savoir comment parcourir le DOM une fois que je parviens à un élément spécifique.

Par exemple, lorsque j'arrive au td avec une classe de "some-class", je veux aller au troisième frère td et récupérer le href de son anchor imbriquée.

<td class="some-class">Content I care about</td>
<td>Content I don't want</td>
<td>Content I don't want</td>
<td>    
    <a href="http://www.the-url-I-want.com">Some Amazing URL</a>
</td>

Actuellement, j'atterris au td je veux via:

foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    HtmlAttribute nodeClass = node.Attributes["class"];

    if(nodeClass != null && nodeClass.Value == "some-class")
    {
        //Find the anchor that is 3 siblings away
        //Do something
    }
}

Est-ce que quelqu'un sait comment j'utiliserais le pack HTMLAgility pour récupérer l'ancre associée pour l'individu td ?

Réponse populaire

Apprenez XPath et votre travail peut être beaucoup plus facile. Par exemple, pour obtenir un élément <td> ayant un attribut de classe égal à "une-classe", nous pouvons utiliser ce Xpath:

//td[@class='some-class']

Et pour avoir le troisième frère suivant <td> :

/following-sibling::td[3]

Donc, votre boucle peut être réécrite comme suit:

var xpath = "//td[@class='some-class']/following-sibling::td[3]/a";
foreach(HtmlNode a in doc.DocumentNode.SelectNodes(xpath))
{
    //Do something with the anchor variable a
}

BTW, moyen plus sûr d’obtenir une valeur d’attribut en utilisant la méthode GetAttributeValue() :

var href = a.GetAttributeValue("href", "");

le deuxième argument est la valeur par défaut qui sera renvoyée lorsque l'attribut est introuvable.




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