Очистка HTML с помощью Nokogiri (вместо Tidy)
на tidy
gem больше не поддерживается и имеет несколько проблем с утечкой памяти.
некоторые люди предложили использовать Nokogiri.
в настоящее время я очищаю HTML, используя:
Nokogiri::HTML::DocumentFragment.parse(html).to_html
у меня есть две проблемы, хотя:
Nokogiri удаляет
DOCTYPE
есть ли простой способ заставить очищенный HTML иметь
html
иbody
тег?
2 ответов
если вы обрабатываете полный документ, вы хотите:
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 strict, Nokogiri выведет документ с этим DOCTYPE, но без требуемого :
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
приложение поддерживается, и это то, что вам действительно нужно. Он гибкий и имеет довольно список вариантов.
вы можете передать HTML ему разными способами и определить его конфигурацию в или передать их в командной строке. Вы могли бы использовать Руби %x{}
, чтобы передать ему файл или использовать IO.popen
или IO.pipe
рассматривать его как трубу.