HtmlAgilityPack跳过或删除嵌套表

时间:2011-06-08 17:58:54

标签: html-agility-pack

我正在使用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) (希望我有意义......)

提前致谢!

1 个答案:

答案 0 :(得分:0)

//是XPATH表达式,表示“扫描所有节点和子节点”。这就是为什么//tr将所有tr都放在根目录之下的原因。

如果您只是parentTable.SelectNodes("tr")(或等同的"./tr"),您将选择根目录下的所有TR。

如果你想跳过第一个,那么你可以在元素的position()(XPATH函数)上添加一个XPATH过滤器:

var parentTableRows = parentTable.SelectNodes("tr[position() > 1]");