如何防止删除<;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实体将其转换为:
<html>
<p>
qwerty
</p>
</html>
它会起作用的
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>
<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>
<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>
这正是我在代码的下一步中不想做的<如果node.name.downcase==“code”
但我在输出中丢失了标记,因为Nokogiri删除了它。没错。Nokogiri试图理解它,但做不到。你必须在Nokogiri看到它之前进行修复。我将尝试使用gsub预解析并在代码块中转换html。谢谢你!您的解决方案可以工作,但我需要在代码块中转义所有HTML,而不仅仅是标记。escapeHTML(node.internal_html)用html.gsub破坏了预解析的内容。也许你可以告诉我一些regexp-gsub-all-content-intag?喜欢,但它是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>], '<\1html>'))
puts doc.to_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>
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>], '<\1html>'))
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>
<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>