Was ich versuche, ist, alle Verbindungen mit einem href-Attribut zu extrahieren, das mit http: //, https: // oder / beginnt. Diese Links liegen in einer Tabelle (tbody> tr> td usw.) mit einer bestimmten Klasse. Ich dachte, ich könnte nur das a-Element ohne den ganzen Pfad angeben, aber es scheint nicht zu funktionieren. Ich erhalte eine NullReferenceException in der Zeile, die die Links auswählt:
var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
{
//not working
Ich kenne keine Empfehlungen oder Best Practices für XPath. Erstelle ich Overhead, wenn ich das Dokument zweimal abfrage?
Verwenden :
//tbody/descendant::a[starts-with(@href,'https://')
or
starts-with(@href,'http://')
or
starts-with(@href,'./')
]
Sie haben immer noch ein Problem , es sei denn, Sie korrigieren Ihren Code, um die Tatsache widerzuspiegeln, dass die XmlNode.SelectNodes()
Instanzmethode den Rückgabetyp XmlNodeList
und nicht HtmlNode
.
Die Probleme bestehen darin, dass Sie die Tabelle auswählen und dann sofort versuchen, die Anker so auszuwählen, als wären sie direkte Nachkommen. In der Mitte befinden sich tr
und td
Tags.
Also, wenn Sie Ihren Xpath zu den folgenden ändern, sollten die Dinge funktionieren:
"tbody/tr/td/a[starts-with(@href, 'https://')]"
Dies funktioniert nicht, wenn Ihre Anker in etwas anderem eingepackt sind. Sie können also alle Anker im aktuellen Knotensatz (dh Tabelle) auswählen:
"//a[starts-with(@href, 'https://')]"
Sehen Sie dies für weitere Einzelheiten über XPath - Syntax.