HtmlAgilityPack C # --- Auswahlknoten Gibt immer eine Null zurück

c# html-agility-pack html-parsing xpath

Frage

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.

Beliebte Antwort

DOM benötigt <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).

Die Lösung

Entfernen Sie den Schritt /tbody axis, und Ihr XPath-Ausdruck funktioniert wahrscheinlich.

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']

Wenn Sie HTML mit und ohne <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']



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum