c# - 如何使XPath仅在每个表中搜索?

标签 c# xpath html-agility-pack

我有一些看起来像这样的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,

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


相对于当前tabletbody元素的一个:

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

现在说明,在
td轴。

要么抢第一,

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


或者,最好将following::轴组合使用
对字符串值following-sibling::进行测试,而不对文本节点进行测试,该文本节点可能埋在中间的格式化元素下面:

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


另请参见Difference between Testing text() nodes vs string values in XPath

关于c# - 如何使XPath仅在每个表中搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882263/

相关文章:

c# - 如何在 C# 中将 xml 文件中的值赋给 datagridviewtextbox?

c# - 从 node.InnerHtml 中删除 "img"和 "a"标签

c# - 使用 HAP 添加样式表

c# - 比较没有年份的 DateTime

xml - 如何使用 XMLFile 设置值?

c# - 更优雅的嵌套 Linq 查询解决方案?

sql-server - SQL Server XML类型从任何标记中选择Attribute = X

c# - HtmlAgilityPack 和身份验证

c# - 如何在不在浏览器中显示的情况下在幕后运行 url?

C# WebAPI 解析带有额外大括号的 Json 数据