Очистка HTML с помощью Nokogiri (вместо Tidy) - PullRequest
8 голосов
/ 07 апреля 2011

Драгоценный камень tidy больше не поддерживается и имеет множество проблем с утечкой памяти.

Некоторые люди предложили использовать Nokogiri.

В настоящее время я очищаю HTML, используя:

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

У меня есть две проблемы:

  • Нокогири удаляет DOCTYPE

  • IsЕсть ли простой способ заставить очищенный HTML иметь теги html и body?

Ответы [ 2 ]

8 голосов
/ 07 апреля 2011

Если вы обрабатываете полный документ, вы хотите:

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>
2 голосов
/ 07 апреля 2011

Возможно, Tidy gem не поддерживается, но базовое приложение tidy поддерживается , и это то, что вам действительно нужно. Он гибкий и имеет список опций .

Вы можете передавать ему HTML различными способами и определять его конфигурацию в файле .tidyrc или передавать их в командной строке. Вы можете использовать Ruby's %x{}, чтобы передать ему файл, или использовать IO.popen, или IO.pipe, чтобы рассматривать его как канал.

...