Dies ist der XPath-Text, den ich zusammen mit dem HtmlAgilityPack C # -Parser verwenden wollte.
//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']
Ich habe versucht, den Xpath-Ausdruck mit Firefox Xpath Add = On zu bewerten und erfolgreich die erforderlichen Elemente erhalten. Aber der c # -Code gibt eine Null-Ausnahme zurück.
HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");
MessageBox.Show(node.ToString());
der Knoten enthält immer Nullwert ... Bitte helfen Sie mir, den Weg zu finden, um dieses Problem zu umgehen ... Danke.
<tbody/>
Tags, die eingefügt werden sollen Alle gängigen Browsererweiterungen zum Erstellen von XPath-Ausdrücken arbeiten am DOM. Im Gegensatz zu den HTML-Spezifikationen erfordern die DOM-Spezifikationen, dass <tr/>
-Elemente in <tbody/>
-Elementen enthalten sind, sodass Browser solche Elemente hinzufügen, wenn sie fehlen. Sie können den Unterschied leicht erkennen, wenn Sie die HTML-Quelle mit Firebug (oder ähnlichen Entwicklertools, die im DOM arbeiten) sehen oder die Seitenquelle anzeigen (mit wget
oder ähnlichen Tools, die bei Bedarf nichts interpretieren).
Entfernen Sie den Schritt /tbody
axis, und Ihr XPath-Ausdruck funktioniert wahrscheinlich.
//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']
<tbody/>
Tags unterstützen müssen Für eine allgemeinere Lösung könnten Sie den Schritt /tbody
axis durch einen decendant-or-self-Schritt //
ersetzen, aber dies könnte in "innere Tabellen" springen:
//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']
Besser wäre es, alternative XPath-Ausdrücke zu verwenden:
//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']
Eine sauberere XPath 2.0-Lösung wäre nur möglich
//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']