如何让XPath只在每个表中搜索?

本文关键字:搜索 XPath | 更新日期: 2023-09-27 18:11:46

我有一点HTML看起来像这样:

<table class="resultsTable">
    <tbody>
        <tr class="even">
            <td width="35%"><strong>Name</strong></td>
            <td>ACME ANVILS, INC</td>
        </tr>
    </tbody>
</table>

和一些c#代码看起来像这样:

var name = document.DocumentNode
                   .SelectSingleNode("//*[text()='Name']/following::td").InnerText

返回

ACME ANVILS, INC.

然而,有一个新的问题。有问题的页面现在返回多个结果:

<table class="resultsTable">
    <tbody>
        <tr class="even">
            <td width="35%"><strong>Name</strong></td>
            <td>ACME ANVILS, INC.</td>
        </tr>
    </tbody>
</table>
<table class="resultsTable">
    <tbody>
        <tr class="even">
            <td width="35%"><strong>Name</strong></td>
            <td>ROAD RUNNER RACES, LLC</td>
        </tr>
    </tbody>
</table>

现在我在处理

var tables = document.DocumentNode.SelectNodes("//table/tbody");
foreach (var table in tables)
{
    var name = table.SelectSingleNode("//*[text()='Name']/following::td").InnerText;
    ...
}

翻转,因为SelectSingleNode返回null。

如何让XPath实际返回结果,仅在我选择的特定表中进行搜索?

如何让XPath只在每个表中搜索?

添加第二个表后,需要进行两个调整:

  1. 更改绝对XPath,

    //*[text()='Name']/following::td
    

    相对于当前的tabletbody元素到1:

    .//*[text()='Name']/following::td
    
  2. 说明现在有多个td元素在following::轴。

    要么直接取第一个

    (.//*[text()='Name']/following::td)[1]
    

    或者,更好的是,使用following-sibling::轴组合对td的字符串值进行测试,而不是对文本节点进行测试,文本节点可能隐藏在中间的格式化元素之下:

     .//td[.='Name']/following-sibling::td
    

    请参见XPath中测试文本()节点与字符串值的区别