繁体   English   中英

HtmlAgilityPack C#— Selectnodes始终返回Null

[英]HtmlAgilityPack C#— Selectnodes Always returns a Null

这是我尝试与HtmlAgilityPack C#解析器一起使用的xpath文本。

//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']

我尝试使用firefox xpath add = on评估xpath表达式,并成功获得了必需的项。 但是C#代码返回Null异常。

HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");            
MessageBox.Show(node.ToString());

该节点始终包含空值...请帮助我找到解决此问题的方法...谢谢..

DOM要求插入<tbody/>标签

用于构建XPath表达式的所有常用浏览器扩展都可在DOM上运行。 与HTML规范相反,DOM规范要求<tr/>元素必须包含在<tbody/>元素内,因此浏览器会在缺少这些元素时添加此类元素。 如果使用Firebug(或在DOM上使用的类似开发人员工具)查看HTML源代码,而不是显示页面源代码(使用wget或在必要时不解释任何内容的类似工具),则可以轻松看出差异。

解决方案

删除/tbody轴步骤,您的XPath表达式可能会起作用。

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']

如果需要同时支持带和不带<tbody/>标签的HTML

对于更通用的解决方案,您可以将/tbody轴步骤替换为dedecant-or-self步骤// ,但这可能会跳转到“内部表”中:

//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']

最好使用替代的XPath表达式:

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt'] 

更加干净的XPath 2.0解决方案是

//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM