如何让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,
//*[text()='Name']/following::td
相对于当前的
table
或tbody
元素到1:.//*[text()='Name']/following::td
-
说明现在有多个
td
元素在following::
轴。要么直接取第一个
(.//*[text()='Name']/following::td)[1]
或者,更好的是,使用
following-sibling::
轴组合对td
的字符串值进行测试,而不是对文本节点进行测试,文本节点可能隐藏在中间的格式化元素之下:.//td[.='Name']/following-sibling::td
请参见XPath中测试文本()节点与字符串值的区别