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