如何防止删除<;html>;在Nokogiri的标签?

如何防止删除<;html>;在Nokogiri的标签?,html,ruby,parsing,nokogiri,Html,Ruby,Parsing,Nokogiri,我有这样的代码: doc = Nokogiri::HTML.fragment(html) doc.to_html 以及将被解析的HTML片段: <p>some paragraph</p> <a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a> <code>

我有这样的代码:

doc = Nokogiri::HTML.fragment(html)
doc.to_html
以及将被解析的HTML片段:

<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    <html>
        <p>
            qwerty
        </p>
    </html>
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>

谢谢

问题是HTML无效。我用这个来测试它:

require 'nokogiri'

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT)
<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    <html>
        <p>
            qwerty
        </p>
    </html>
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
EOT

puts doc.errors
原因是,在
块中,标记并没有按其应有的方式进行HTML编码

使用HTML实体将其转换为:

&lt;html&gt;
    &lt;p&gt;
        qwerty
    &lt;/p&gt;
&lt;/html&gt;
它会起作用的

Nokogiri是一个XML/HTML解析器,它试图修复标记中的错误,以使程序员有机会使用文档。在这种情况下,由于
块位于错误的位置,它会删除标记。Nokogiri不在乎标签是否被编码,因为在这一点上,它们只是文本,而不是标签


编辑:

我将尝试使用gsub预解析并在代码块中转换html

哪些产出:

<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    &lt;html&gt;
        <p>
            qwerty
        </p>
    &lt;/html&gt;
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    &lt;html&gt;
        &lt;p&gt;
            qwerty
        &lt;/p&gt;
    &lt;/html&gt;
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>

这正是我在代码的下一步中不想做的<如果node.name.downcase==“code”
但我在输出中丢失了标记,因为Nokogiri删除了它。没错。Nokogiri试图理解它,但做不到。你必须在Nokogiri看到它之前进行修复。我将尝试使用gsub预解析并在代码块中转换html。谢谢你!您的解决方案可以工作,但我需要在代码块中转义所有HTML,而不仅仅是标记。escapeHTML(node.internal_html)用html.gsub破坏了预解析的内容。也许你可以告诉我一些regexp-gsub-all-content-in
tag?喜欢,但它是escape和
,但我只需要块的内容。tnxy您无法使用
node.internal\u html
,因为Nokogiri此时已经删除了
标记。您必须在将内容传递给Nokogiri之前对其进行处理,然后才能找到
标签并对其内容进行按摩。最好的答案是,无论您从哪里获得HTML,都需要修复它,因为它们生成了糟糕的HTML。
require 'nokogiri'

html = <<EOT
<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    <html>
        <p>
            qwerty
        </p>
    </html>
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
EOT

doc = Nokogiri::HTML::DocumentFragment.parse(html.gsub(%r[<(/?)html>], '&lt;\1html&gt;'))

puts doc.to_html
<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    &lt;html&gt;
        <p>
            qwerty
        </p>
    &lt;/html&gt;
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
require 'cgi'
require 'nokogiri'

html = <<EOT
<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    <html>
        <p>
            qwerty
        </p>
    </html>
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
EOT

doc = Nokogiri::HTML::DocumentFragment.parse(html.gsub(%r[<(/?)html>], '&lt;\1html&gt;'))

code = doc.at('code')
code.content = CGI::unescapeHTML(code.inner_html)

puts doc.to_html
<p>some paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>
<code>
    &lt;html&gt;
        &lt;p&gt;
            qwerty
        &lt;/p&gt;
    &lt;/html&gt;
</code>
<p>some other paragraph</p>
<a href="https://url...com"><span style="color: #a5a5a5;"><i>qwerty</i></span> ytrewq </a>