使用Nokogiri(而不是Tidy)清理HTML



不再维护tidy gem,并且存在多个内存泄漏问题。

一些人建议使用Nokogiri。

我正在使用:

清理HTML

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

我有两个问题:

  • Nokogiri移除DOCTYPE

  • 是否有一种简单的方法来强制清理的HTML有htmlbody标签?

如果您正在处理一个完整的文档,您需要:

Nokogiri::HTML(html).to_html

这将强制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>

注意,不能保证输出在语法上是有效的。例如,如果我提供了一个破损的文档,它撒谎并声称它是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.popenIO.pipe将其视为管道。

相关内容

  • 没有找到相关文章

最新更新