HtmlAgilityPack Auswahl childnodes nicht wie erwartet
-
21-08-2019 - |
Frage
Ich versuche, die HtmlAgilityPack Bibliothek verwenden einige Links in einer Seite zu analysieren, aber ich bin nicht sehen die Ergebnisse, die ich von den Methoden erwarten. Im Folgenden habe ich eine HtmlNodeCollection von Links. Für jede Verbindung möchte ich überprüfen, ob ein Bild Knoten ist und dann seine attribures analysieren, aber die Select und SelectSingleNode Methoden der linkNode das übergeordnete Dokument nicht auf der Suche die childnodes von linkNode zu sein scheint, was gibt?
HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
foreach(HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
if (linkTitle == string.Empty)
{
HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");
}
}
Gibt es eine andere Art, wie ich das alt-Attribut des Bildes childNode von linkNode bekommen könnte, wenn es vorhanden ist?
Lösung
Sie sollten den forwardslash Präfix von „/ img [@alt]“ entfernen, da es bedeutet, dass Sie an der Wurzel des Dokuments beginnen sollen.
HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
Andere Tipps
Mit einer XPath-Abfrage Sie auch verwenden können „“ um anzuzeigen, sollte die Suche am aktuellen Knoten starten.
HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
Auch Achten Sie auf Null Check-out. Select null zurück, anstatt leerer Sammlung.
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
**if(linkNodes!=null)**
{
foreach(HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
if (linkTitle == string.Empty)
{
**HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");**
}
}
}