[英]Trouble selecting nodes with Html Agility Pack
我有当前的HTML布局
<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>
我正在尝试获取//table[1]//table[2]
,但对于以下内容,我一直保持空HtmlNode( System.NullReferenceException
):
不起作用: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[2]//tbody//tr");
,
我不确定为什么会这样,因为当我尝试获取//table[1]//table[1]
,使用这种语法就可以正常工作
作品: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[1]//tbody//tr");
我是否误解了索引如何与HTML Agility Pack一起使用?
//table[2]
在同一个父对象中返回第二个<table>
元素,因为在XPath中:
(
[]
)的优先级(优先级)比(//
和/
)高。 [ 供参考 ]
在您的情况下,每个<td>
只有一个<table>
<td>
,因此Xpath表达式什么也不返回。 一种可能的解决方案是将方括号括起来以更改优先级:
(//table[2]//tbody//tr//td//table)[2]//tbody//tr
在Xpath上方,从内部XPath //table[2]//tbody//tr//td//table
返回的所有<table>
获得第二个<table>
元素。 然后从该<table>
继续返回后代//tbody//tr
元素。
我最终不得不根据tr
的不tr
来确定为什么我的另一种方法行不通,但是这种方法行得通。
我基本上将索引移到了表格之上的下一层。 因此,在第一个tbody
中,此后的每个表都在tr / td语句中,并且我只是构造了HtmlNode来索引tr
的索引。 如果您扩大选择流程,也许敏捷包会更好用? IDK。
无论如何...
对于table[2]//table[1]
我使用了:
HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table");
foreach (var cell in table.SelectNodes(".//tr//td/p"))
...
如果您注意到上面的示例HTML,我选择了tr [2],因为我之前有一个tr / td,中间有一个空格
对于table[2]//table[2]
HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[3]//table[1]");
foreach (var cell in table.SelectNodes(".//tr//td"))
...
对于遇到问题的任何人,请尝试通过将特定标签推入更广泛的标签来将搜索范围扩大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.