HtmlAgilityPack C#--- Selectnodes始终返回Null

c# html-agility-pack html-parsing xpath

这是我试图与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

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

//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 with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因