用Nokogiri(而不是Tidy)清理HTML

不再维护
tidy
gem并且存在多个内存泄漏问题。 有人建议使用Nokogiri。 我目前正在使用以下方法清理HTML:
Nokogiri::HTML::DocumentFragment.parse(html).to_html
我有两个问题: Nokogiri删除了
DOCTYPE
有没有一种简单的方法可以强制清理的HTML有一个
html
body
标签?     
已邀请:
如果您正在处理完整文档,则需要:
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>
    
可能不支持Tidy gem,但维护了底层的
tidy
应用程序,这正是您真正需要的。它很灵活,有很多选项。 您可以通过多种方式将HTML传递给它,并在
.tidyrc
文件中定义其配置或在命令行上传递它们。您可以使用Ruby的
%x{}
将其传递给文件或使用
IO.popen
IO.pipe
将其视为管道。     

要回复问题请先登录注册