The problem occurs because you’re using the wrong method in Nokogiri to parse your content.
require 'nokogiri'
doc = Nokogiri::HTML('<p>foobar</p>')
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><p>foobar</p></body></html>
Rather than using HTML
which results in a complete document, use HTML.fragment
, which tells Nokogiri you only want the fragment parsed:
doc = Nokogiri::HTML.fragment('<p>foobar</p>')
puts doc.to_html
# >> <p>foobar</p>