Ich analysiere ein HTML-DOM in C # mit der HTMLAgilityPack
Bibliothek und würde gerne wissen, wie man das DOM durchquert, sobald ich zu einem bestimmten Element komme.
Zum Beispiel, wenn ich mit einer Klasse von "irgendeiner Klasse" zur td
komme, möchte ich zum dritten Geschwister td
und die href
von seinem verschachtelten anchor
holen.
<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>
Momentan td
ich bei der td
ich möchte über:
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
}
}
Weiß jemand, wie ich HTMLAgility-Pack verwenden würde, um den verwandten Anker für die einzelnen td
zu greifen?
Lernen Sie XPath und Ihre Arbeit kann viel einfacher sein. Um zum Beispiel das <td>
-Element mit dem Klassenattribut gleich "some-class" zu erhalten, können wir diesen Xpath verwenden:
//td[@class='some-class']
Und um drittes nächstes Geschwister zu bekommen <td>
:
/following-sibling::td[3]
So kann Ihre Schleife wie folgt umgeschrieben werden:
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, sicherer Weg, Attributwert zu bekommen, ist GetAttributeValue()
Methode:
var href = a.GetAttributeValue("href", "");
Das zweite Argument ist der Standardwert, der zurückgegeben wird, wenn das Attribut nicht gefunden wurde.