Если вы обрабатываете полный документ, вы хотите:
Nokogiri::HTML(html).to_html
Это заставит теги html
и body
и введет или сохранит DOCTYPE
:
puts Nokogiri::HTML('<p>Hi!</p>').to_html
#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
#=> "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body><p>Hi!</p></body></html>
puts Nokogiri::HTML('<!DOCTYPE html><p>Hi!</p>').to_html
#=> <!DOCTYPE html>
#=> <html><body><p>Hi!</p></body></html>
Обратите внимание, что выходные данные не гарантируются синтаксически действительными. Например, если я предоставлю испорченный документ, который лжет и заявляет, что он строго соответствует HTML4.01, Nokogiri выведет документ с этим DOCTYPE, но без обязательного раздела <head><title>...</title></head>
:
dtd = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'
puts Nokogiri::HTML("#{dtd}<p>Hi!</p>").to_html
#=> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
#=> "http://www.w3.org/TR/html4/strict.dtd">
#=> <html><body><p>Hi!</p></body></html>