2014-11-05 141 views
0

我一直在尝试使用HtmlAgilityPack获得下面的值,但没有成功。我正在使用SelectSingleNode。htmlagilitypack使用SelectSingleNode

这是我的html。

<html> 
<body> 
    <table> 
     <tr><td>One</td></tr>  
    </table> 
</body> 
</html> 

下面是代码隐藏。

HtmlDocument doc = new HtmlDocument(); 
doc.Load("C:\\test.html"); 

HtmlNode test = doc.DocumentNode.SelectSingleNode("/html/body/table/tbody/tr/td"); 
Console.WriteLine(test.InnerHtml); 

test(HtmlNode)变量为空。

我如何获得其中的价值是One

回答

1

如图所示的样品tbody节点,以便您的XPath将返回没有节点(nullSelectSingleNode)。

修复:

HtmlNode test = doc.DocumentNode.SelectSingleNode("/html/body/table/tr/td"); 

调试提示:建立的XPath慢慢来并且检查每个结果/子节点:

 "/html/body/table/" - some children 
    "/html/body/table/tbody/" - null 
    "/html/body/table/tr/" - some children 
    "/html/body/table/tr/td" - score 
+0

谢谢你。是的,我知道没有tbody,但是当我使用Chrome的开发人员工具(F12),然后复制元素的xpath(右键单击)时,xpath包含tbody文本。 – Odee 2014-11-05 18:19:33

1

Using XPath in SelectSingleNode: Retrieving individual element from XML if it's present你需要使用text()

var test = doc.DocumentNode.SelectSingleNode("/html/body/table/tr/td/text()"); 

此外,你需要删除tbody。在你的html中没有tbody

+0

为什么你期望的子节点(文本)存在时,父母找不到? – 2014-11-05 17:10:05

+0

好点。刚注意到原来的xpath引用了一个不存在的'tbody'节点。 – 2014-11-05 17:13:02

+0

+1:实际答案(样本中不存在'tbody')。请注意,text()绝对与问题无关,并且不需要(除非实际在“td”内查找文本节点,这不是OP的示例所显示的内容 - InnerHtml也包含所有节点 - 对于特定样本也相同) – 2014-11-05 17:23:43