用Nokogiri清理HTML(而不是Tidy)

Chr*_*rey 8 ruby tidy nokogiri

tidy宝石不再维护,并有多个内存泄漏问题.

有人建议使用Nokogiri.

我目前正在使用以下方法清理HTML:

Nokogiri::HTML::DocumentFragment.parse(html).to_html

我有两个问题:

  • Nokogiri删除了 DOCTYPE

  • 有没有一种简单的方法可以强制清理的HTML有一个htmlbody标签?

Phr*_*ogz 8

如果您正在处理完整文档,则需要:

Nokogiri::HTML(html).to_html
Run Code Online (Sandbox Code Playgroud)

这将强制htmlbody标记,并引入或保留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>
Run Code Online (Sandbox Code Playgroud)

请注意,输出不保证在语法上有效.例如,如果我提供了一个破损的文档,并声称它是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>
Run Code Online (Sandbox Code Playgroud)