我正在尝试使用HTML Agility Pack解析一些HTML。以下代码片段选择包含我需要的信息的表元素,但我需要深入研究表格。
一旦我拥有表格的InnerHtml,我打算寻找一个<td>
,其中包含一个非文本值为“Field#2”的文件。但是,我需要选择NEXT <td>
的innertext。在这个例子中,我需要值110。我该怎么做?
foreach (var x in doc.DocumentNode.SelectNodes("//table[contains(@class,'data')]"))
{
// psuedo code - search for td and use "contains" on the inner text / html.
// Then, grab the next td inner html.
Console.WriteLine(x.InnerHtml);
}
<tr>
<td width="158"><strong>Field #1:</strong></td>
<td width="99">1</td>
<td width="119"><strong>Field #2:</strong></td>
<td width="176">110</td>
</tr>
<tr>
<td width="158"><strong>Field #3:</strong></td>
<td width="99">85</td>
<td width="119"><strong>Field #4:</strong></td>
<td width="176">-259.34</td>
</tr>
<tr>
<td width="158"><strong>Field #5:</strong></td>
<td width="99">1</td>
<td width="119"><strong>Field #6:</strong></td>
<td width="176">110</td>
</tr>
<tr>
<td width="158"><strong>Field #7:</strong></td>
<td width="99">12</td>
<td width="119"><strong>Field #8:</strong></td>
<td width="176">123.23</td>
</tr>
答案 0 :(得分:1)
这段代码将返回您想要的td行。
//<td width="176">110</td>
var td = x.SelectNodes("//td").SkipWhile(g => !g.InnerText.Contains("Field #2:")).Select(s => s).Skip(1).FirstOrDefault();
答案 1 :(得分:0)
不确定敏捷包是否支持它,但在XPath中,您可以使用/following-sibling
查询下一个兄弟:
doc.DocumentNode.SelectNodes(
"//table[contains(@class,'data')]/tr/" +
"td[/strong/text()='Field #2:']" +
"/following-sibling:td");
本质上 - 找到具有给定文本的所有td
个节点,并将它作为下一个同级td
节点。