为什么Nokogiri会删除内容?

时间:2011-05-06 23:21:23

标签: html ruby nokogiri

我有这样的内容:

<div class="CodeRay">
  <div class="code"><pre>puts <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">&quot;</span><span style="">Hello, world!</span><span style="color:#710">&quot;</span></span></pre></div>
</div>

我希望使用Nokogiri将其添加到HTML文档中:

File.open("frame2.html", "r") do |file|
  doc = Nokogiri::HTML.parse(file)
end
doc.at_css("body") = content # this is my content 
puts doc.to_html

然后内容转换为:

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;puts &lt;span style="background-color:#fff0f0;color:#D20"&gt;&lt;span style="color:#710"&gt;&amp;quot;&lt;/span&gt;&lt;span style=""&gt;Hello, world!&lt;/span&gt;&lt;span style="color:#710"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

HTML文件的另一部分是可以的。问题是为什么Nokogiri剥离内容?为什么要将其转换为HTML实体?

1 个答案:

答案 0 :(得分:7)

我重新格式化了您的内部HTML,使其更具可读性。

Nokogiri并没有剥离任何东西,它只是编码正在添加的内容,因为你告诉它。

除非您告诉Nokogiri新文本已经是HTML,否则它会假设您正在添加文本,并且由于文本包含应编码的字符,因此它会为您编码。

以下是如何做你真正想要的事情:

require "nokogiri"

html = '<div class="CodeRay">
  <div class="code">
    <pre>puts <span style="background-color:#fff0f0;color:#D20">
      <span style="color:#710">&quot;</span>
      <span style="">Hello, world!</span>
      <span style="color:#710">&quot;</span>
      </span>
    </pre>
  </div>
</div>'

doc = Nokogiri::HTML('<html><body></body></html>')
doc.at('body').inner_html = html
puts doc.to_html

>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
>> <html><body><div class="CodeRay">
>>   <div class="code">
>>     <pre>puts <span style="background-color:#fff0f0;color:#D20">
>>       <span style="color:#710">"</span>
>>       <span style="">Hello, world!</span>
>>       <span style="color:#710">"</span>
>>       </span>
>>     </pre>
>>   </div>
>> </div></body></html>