2014-01-24 36 views
0

我正在尝试使用CSQuery来描述站点的DOM。如果我在IE中打开一个站点并检查一个元素,则它的HTML与使用CSQuery.CreateFromUrl方法加载的同一站点略有不同(属性的排序和值之间的间距)。例如,由IE生成的div样式为“style = margin-bottom:0.5em;”和相同的div CSQuery的Render方法生成不同的HTML“style = margin-bottom:0.5em;” [之后没有空格]。为什么IE生成的DOM和CSQuery DOM有区别?

,当我创建像CSQuery选择的结果“DIV [风格=‘保证金左:0.5em;’]”这是行不通的,因为CSQuery的内部DOM没有之间的空间“:”和'0.5'。

我的问题是我的应用程序用户将使用IE来检查DOM元素,因此创建CSS选择器来使用CSQuery查询DOM。对于这种情况,我可以从代码中的选择器中删除空格,但我不想这样做,因为其他选择器之间可能存在一些其他细微差异。

那么有什么办法可以确保CSQuery生成与IE相同的DOM吗? 我尝试过使用CSQuery.Creat(HTML通过IE返回),但CSQuery仍然以不同于IE DOM的方式格式化HTML。

感谢, 托尼

回答

0
  1. 为了确保您将获得CsQuery对象相同的响应,在IE浏览器应该关闭JavaScript在浏览器中,并且不接受来自网站的cookie。 (CQ.CreateFromURL返回一个未被javascript使用的渲染DOM)。此外,有时候有一个传送响应通过cookie传送。

在你的情况下,你只需要设置一个'分析方法'。

Check out official documentation

寻找一个部分 '从HTML创建'。

好运。

+0

我在创建方法中尝试了HtmlParsingMode和HtmlParsingOptions的不同组合,但没有用。关于使用Ajax加载额外内容的网站,CSQuery.CreatFromUrl如何处理这些网站并为它们生成DOM? – TonyMull

+0

即使我从我的webbrowser控件获取html,然后从这个html创建CSQuery对象,它会稍微改变/修改html的格式... – TonyMull

+0

@TonyMull如果一个网站通过AJAX加载内容,CsQuery将无法处理该内容。这种情况下,你需要找到一个网址并由你自己加载。 进行测试: 在VS浏览器上运行您的URL并查看它返回的响应。如果它与您在浏览器中获得的相同,那么CsQuery中的问题,但如果它不是... – nazarkin659

0

问题是既不IE或CsQuery,都按设计工作。问题在于你期望来自两个不同解析引擎的相同输出。 IE浏览器使用mshtml,CsQuery正在模拟Firefox使用的Gecko。因此,要获得相同的输出,您需要切换到mshtml或让用户使用Firefox。您挑选的组合会有多重差异,因为解析哲学略有不同,它显示了您所看到的这些异常情况。