【问题标题】:HtmlAgilityPack C#--- Selectnodes Always returns a NullHtmlAgilityPack C#--- Selectnodes 总是返回 Null
【发布时间】:2013-08-05 08:18:20
【问题描述】:

这是我尝试与 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());

节点总是包含空值... 请帮助我找到解决此问题的方法... 谢谢。。

【问题讨论】:

标签: c# xpath html-parsing html-agility-pack


【解决方案1】:

DOM 要求插入 <tbody/> 标签

用于构建 XPath 表达式的所有常见浏览器扩展都适用于 DOM。与 HTML 规范相反,DOM 规范要求 <tr/> 元素位于 <tbody/> 元素内,因此浏览器会在缺少此类元素时添加此类元素。如果使用 Firebug(或在 DOM 上工作的类似开发人员工具)查看 HTML 源代码与显示页面源代码(使用wget 或在必要时不解释任何内容的类似工具)查看 HTML 源代码,您可以很容易地看到差异。

解决方案

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

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

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

对于更通用的解决方案,您可以将/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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多