Ich habe das aktuelle HTML-Layout
<table> //table[1]
</table>
<table> //table[2]
<tbody>
<tr>
<td>
<p>
</p>
</td>
</tr>
<tr>
<td>
<table> //table[1]//table[1]
<tbody>
<tr>
<td>
<p>
INFO 1
</p>
</td>
<td>
<p>
INFO 2
</p>
</td>
<td>
<p>
INFO 3
</p>
</td>
<td>
<p>
INFO 4
</p>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td>
<table> //table[1]//table[2]
<tbody>
<tr>
<td>
<p><strong>Name</strong></p>
</td>
<td>
<p><strong>Quantity</strong></p>
</td>
</tr>
<tr>
<td>
<p>Apples </p>
</td>
<td>10</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td>
<table> //table[1]//table[3]
</table>
</td>
</tr>
</tbody>
</table>
Ich versuche, die Daten in //table[1]//table[2]
, aber ich bekomme immer eine Null HtmlNode ( System.NullReferenceException
) für Folgendes:
funktioniert nicht: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[2]//tbody//tr");
,
Ich bin nicht sicher, warum dies auftritt, wenn ich versuche, Daten für //table[1]//table[1]
, funktioniert es gut mit dieser Syntax
funktioniert: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[1]//tbody//tr");
Missverstehe ich, wie die Indexierung mit dem Html Agility Pack funktioniert?
//table[2]
zweite <table>
-Element im selben Elternteil zurück, weil in XPath:
Das (
[]
) hat eine höhere Priorität (Priorität) als (//
und/
). [ Als Referenz ]
In Ihrem Fall gibt es nur eine <table>
in jedem <td>
, daher gab der Xpath-Ausdruck nichts zurück. Eine mögliche Lösung besteht darin, Klammern zu setzen, um die Priorität zu ändern:
(//table[2]//tbody//tr//td//table)[2]//tbody//tr
Über Xpath erhält das zweite <table>
-Element von allen <table>
s, die von der inneren XPath //table[2]//tbody//tr//td//table
. Dann von dieser <table>
weiter Nachkommen //tbody//tr
Elemente zurückgeben.
Ich musste das alles von Grund auf tr
mir nicht sicher, warum mein anderer Weg nicht funktionierte, aber dieser Weg funktioniert.
Ich habe meine Indexierung auf die nächste Ebene über meinem Tisch verschoben. So in der ersten tbody
jede Tabelle danach innerhalb eines tr / td Aussage, und ich einfach konstruierte ich meine HtmlNode indizieren aus der tr
‚s. Vielleicht funktioniert Agility Pack besser, wenn Sie den Auswahlprozess erweitern? IDK.
Sowieso...
Für table[2]//table[1]
ich:
HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table");
foreach (var cell in table.SelectNodes(".//tr//td/p"))
...
Ich habe tr [2] ausgewählt, da ich zuvor einen tr / td mit einem Leerzeichen hatte, wenn Sie das obige HTML-Beispiel beachten
Für table[2]//table[2]
ich verwendet
HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[3]//table[1]");
foreach (var cell in table.SelectNodes(".//tr//td"))
...
Wenn Sie Probleme haben, versuchen Sie, Ihre Suche auf eine breitere Auswahl zu verschieben, indem Sie bestimmte Tags auf breitere setzen.