【发布时间】:2011-04-07 17:08:44
【问题描述】:
tidy gem 不再维护,存在多个内存泄漏问题。
有人建议使用 Nokogiri。
我目前正在使用以下方法清理 HTML:
Nokogiri::HTML::DocumentFragment.parse(html).to_html
我有两个问题:
Nokogiri 删除了
DOCTYPE有没有一种简单的方法可以强制清理后的 HTML 具有
html和body标签?
【问题讨论】:
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 app is maintained,这才是你真正需要的。它很灵活,并且有相当多的list of options。
您可以通过多种不同的方式将 HTML 传递给它,并在 .tidyrc 文件中定义其配置或在命令行上传递它们。您可以使用 Ruby 的 %x{} 向其传递文件或使用 IO.popen 或 IO.pipe 将其视为管道。
【讨论】: