Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#\HtmlAgilityPack解析其他然后是FIreBug_C#_Html Parsing_Firebug_Html Agility Pack - Fatal编程技术网

C#\HtmlAgilityPack解析其他然后是FIreBug

C#\HtmlAgilityPack解析其他然后是FIreBug,c#,html-parsing,firebug,html-agility-pack,C#,Html Parsing,Firebug,Html Agility Pack,im使用HtmlAgilityPack解析Html节点, 我使用firebug搜索我要查找的节点属性,比如类名为“ABC”的div 我注意到有时候我找的div没有结果,我调试了一下,发现firebug和HtmlAgilityPack中的XPATH对于同一个节点是不同的:S /html[1]/body[1]/div[2]/div[3]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[

im使用
HtmlAgilityPack
解析Html节点, 我使用firebug搜索我要查找的节点属性,比如类名为“ABC”的div 我注意到有时候我找的div没有结果,我调试了一下,发现firebug和HtmlAgilityPack中的
XPATH
对于同一个节点是不同的:S

/html[1]/body[1]/div[2]/div[3]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[2]/td[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/td[1]/div[1]

/html/body/div[3]/div[3]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/div/table/tbody/tr/td/div/table/tbody/tr[2]/td/div[2]/table/tbody/tr/td/div/div/table/tbody/tr[3]/td/table/tbody/tr/td[2]/div

第一个是萤火虫。没有人知道我错在哪里?

有两个可能的原因

  • HTML Agility Pack未正确解析HTML
  • 网页加载后已被客户端脚本更改。使用Firebug查看时,您看到的是DOM,而不是HTML源代码。HAP只能用于HTML源代码
  • 您将注意到,在显示的路径中(例如),HAP版本中没有TBODY标记。TBODY在HTML标记中是可选的,但在完整的DOM中仍然是必需的标记。如果缺少TBODY,浏览器HTML解析器将始终添加TBODY。哈普不会。这可能导致在浏览器中工作的路径在HAP中失败


    HAP的另一个替代方案是(on),它使用符合标准的HTML解析器(实际上是与Firefox相同的解析器)。CsQuery是一个C#jquery端口,它与CSS选择器(而不是xpath)配合使用。它应该为您提供一个与浏览器显示的DOM相匹配的DOM。但是,如果问题仅仅是javascript正在改变DOM,那么这不会改变任何事情。

    Html Agility Pack只关注标记。它不知道事物将如何呈现。我认为Firebug依赖于firefox内存DOM中的当前内存,这可能会有很大的不同。这就是为什么您会看到像TBODY这样的元素只存在于DOM中,而不存在于标记中(它们是可选的)

    此外,您还可以添加一个事实,即对于给定的Xml节点,有一个无限可能的XPATH表达式

    总之,一般来说,使用Html Agility Pack进行查询时所需的XPATH不需要工具提供的完整XPATH表达式。您只需要关注判别式,例如特定属性(如类)、id等。。。。您的代码将更能抵抗更改。但这意味着您需要了解一些XPATH(这是一个很好的起点:)。因此,您确实希望构建如下XPATH表达式:

    //div[@class = 'ABC']
    

    它将获取所有具有名为“ABC”的CLASS属性的DIV元素。

    Hi,“我注意到有时候我找的DIV没有结果”什么没有结果?(Firebug,HtmlAgilityPack,…)HtmlAgilityPack返回null。您是否可以共享(如果可能)呈现的HTML文档(例如,在上),以便我们可以测试XPath表达式?我不熟悉JSFIDLE,我粘贴在pastebin上。当我在firefox上按view source code时,我得到了这个-我从HAP得到这个-作为documentNode.OuterHtml-而且,我使用firepath,它允许将xpath写入firebug,我从那里得到表达式,粘贴到HAP,有时得到0结果:我注意到javascript在加载页面后改变了一些页面,也许这就是问题所在,不管怎样,我可以在javascript运行后获得该页面?你有任何与这个特定问题相关的具体“事实”作为理由吗?Html Agility Pack并不是涉及的唯一一段代码。@Simon Mourier,HAP的解析器是否执行标记插值,或者是否符合HTML5解析器规范?我上次检查时没有。在我做过的许多测试用例中,在涉及可选标记(以及解析无效标记的规则,这些规则非常广泛)的情况下,它不会返回与浏览器相同的DOM。据我所知,它从未声称是这样。@roee-你不能,使用本机.NET解决方案。你真的想要一个“无头浏览器”——一个既能解析HTML又能运行脚本的浏览器,就像一个真正的浏览器一样:一个没有查看窗口的浏览器。NET中没有完整的浏览器控件,您最好使用浏览器控件,它不是特别干净或快速,但应该可以工作。