首页 > 解决方案 > Nokogiri:当 HTML 代码无效时,x-path 查询失败

问题描述

我有一个(稍微)无效的 HTML 文档,如下所示:

<p>
    1
</p>
<p>
    <div>
        2
    </div>
</p>
<p>
    3
</p>

W3C 不允许divp.

因此 Chrome(以及我猜的许多其他浏览器)隐含地更正了 HTML 代码,如下所示(如本文所述:将 <div> 放入 <p> 正在添加一个额外的 <p>):

<p>
    1
</p>
<p>
</p>
<div>
    2
</div>
<p>
</p>
<p>
    3
</p>

浏览器通过添加第二个来更正 HTML p,现在有 2 个空p的和一个div位于根级别的。对于浏览器来说,这是真实的世界,它总是会说总共有 4p个。

我正在使用此处描述p的 Javascript构建最后一个 xpath:如何使用 Firebug xpath.js 脚本?prevSibling

prevSibling正在迭代所有 3 个之前p的返回值/p[4]p这在 W3C 定义(和浏览器)方面是完全正确的。

然而,Nokogiri 省略了第二个空p并添加了一个错误:

意外的结束标签:p

对于 Nokogiri,总共只有 3p个这样的:

<p>
    1
</p>
<p>
</p>
<div>
    2
</div>
<p>
    3
</p>

因此,当我从我的 Javascript 代码(即/p[4])中获得“正确”的 xpath 时,我想p使用 Nokogiri访问最后一个at_xpath("/p[4]")。但我得到nil是因为 Nokogiri 只有 3 p

如何让 Nokogiri 以与浏览器相同的方式处理无效 HTML(即添加第二个空的 HTML ),以便在通过搜索访问它时p获得最后一个?p/p[4]

标签: htmlruby-on-railsrubynokogiri

解决方案


推荐阅读