我正在使用HtmlAgilityPack来检索以下html(注意嵌套表):
<table class="123">
<tr>
<table class="789">
<tr>
<td>abc</td>
</tr>
<tr>
<td>def</td>
</tr>
</table>
</tr>
<tr>
<td>info 1</td>
</tr>
<tr>
<td>info 2</td>
</tr>
<tr>
<td>info 3</td>
</tr>
</table>
现在,我正在尝试找到一种聪明的方法来从父表中获取一些信息,并从嵌套表中获取一些信息......
到目前为止,我有以下内容:
var parentTable = document.DocumentNode.SelectNodes("//table[@class='123']").FirstOrDefault();
var nestedTable = parentTable.SelectNodes("//table[@class='789']").FirstOrDefault();
我现在可以使用nestedTable来获取我想要的东西(abc,def)......
但是当我尝试从父表中获取<tr>
时,如下所示:
var parentTableRows = parentTable.SelectNodes(".//tr");
它似乎也包含(在集合中)嵌套表中的<tr>
...
换句话说,根据上面的html代码,我希望有一个4 <tr>
的集合,但由于它包含嵌套表中的<tr>
,我是获得6 <tr>
的集合。
我如何跳过碰巧持有嵌套表的第一个<tr>
,这样我就可以玩并获取我想要的信息(info1,info2,info3)
(希望我有意义......)
提前致谢!
答案 0 :(得分:0)
//
是XPATH表达式,表示“扫描所有节点和子节点”。这就是为什么//tr
将所有tr都放在根目录之下的原因。
如果您只是parentTable.SelectNodes("tr")
(或等同的"./tr"
),您将选择根目录下的所有TR。
如果你想跳过第一个,那么你可以在元素的position()
(XPATH函数)上添加一个XPATH过滤器:
var parentTableRows = parentTable.SelectNodes("tr[position() > 1]");