2012-10-03 74 views
0

我想使用HTML敏捷包解析一些HTML。下面的代码片段选择包含我需要的信息的表格元素,但是我需要深入研究表格。例如,一旦我具有表格的InnerHtml,我打算寻找一个<td>,其中的字段值为“字段#2”。但是,那么我需要选择NEXT <td>的内文。在这个例子中,我需要值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> 

回答

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(); 
0

不知道敏捷包支持,但在XPath中可以使用/following-sibling查询下一个兄弟:

doc.DocumentNode.SelectNodes(
    "//table[contains(@class,'data')]/tr/" + 
     "td[/strong/text()='Field #2:']" + 
     "/following-sibling:td"); 

本质 - 找到所有与给定文本的td节点,和给我它的下一个兄弟td节点。

+0

差不多正确,需要有'。'在'/ strong /'之前和之后的“兄弟姐妹”之后,必须有两个':'。然后它工作得很好。 – shriek