我有一些看起来像这样的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
元素的一个:.//*[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/