#html #ruby #nokogiri
#HTML #ruby #nokogiri
Вопрос:
У меня есть это содержимое:
<div class="CodeRay">
<div class="code"><pre>puts <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">amp;quot;</span><span style="">Hello, world!</span><span style="color:#710">amp;quot;</span></span></pre></div>
</div>
и я хочу добавить это в HTML-документ с помощью Nokogiri:
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
Затем содержимое преобразуется в это:
amp;<div class="CodeRay"amp;>
amp;<div class="code"amp;>amp;<preamp;>puts amp;<span style="background-color:#fff0f0;color:#D20"amp;>amp;<span style="color:#710"amp;>amp;amp;quot;amp;</spanamp;>amp;<span style=""amp;>Hello, world!amp;</spanamp;>amp;<span style="color:#710"amp;>amp;amp;quot;amp;</spanamp;>amp;</spanamp;>amp;</preamp;>amp;</divamp;>
amp;</divamp;>
Другая часть HTML-файла в порядке. Вопрос в том, почему Nokogiri удаляет содержимое? Почему он преобразует его в HTML-объекты?
Ответ №1:
Я переформатировал ваш внутренний 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">amp;quot;</span>
<span style="">Hello, world!</span>
<span style="color:#710">amp;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>