如何选择NEXT元素?

时间:2012-10-03 02:33:53

标签: c# .net-4.0 html-parsing html-agility-pack

我正在尝试使用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>

2 个答案:

答案 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节点。