Отключить исправление ошибок в Nokogiri

#html #ruby #nokogiri #hpricot

#HTML #ruby #nokogiri #hpricot

Вопрос:

Я работаю с несколькими искаженными HTML-страницами. По крайней мере, я предполагаю, что они искажены, потому что, когда я анализирую их в Nokogiri, а затем выполняю to_html, элементы больше не отображаются корректно. Однако, когда я анализирую их с помощью Hpricot, они отображаются правильно.

Я бы предпочел не использовать Hpricot, потому что кажется невозможным добавить экземпляры Hpricot::Elem в документ (без преобразования их в строки, добавления, а затем повторного анализа).

Могу ли я отключить исправление ошибок Nokogiri, чтобы я мог сохранить HTML ближе к тому, как он был написан?

Комментарии:

1. Отличный вопрос. Мне еще предстоит выяснить различия. Пока я этого не сделаю, вы можете увидеть исходный html по адресу ( pastie.org/2638305 ) и nokogiri.to_html код в ( pastie.org/2638308 ).

2. Я обнаружил, что «исправление ошибок» Hpricot портит один из наших сайтов, применяя правило don’t-wrap-block-elements-within-inline-elements, то есть извлекая элемент блока (обернутый) и помещая его после встроенного элемента (оболочки). Установка :fixup_tags и :xhtml_strict значение false не предотвращает это поведение.

3. Является ли ваш HTML допустимым XML? Если это так, то вы можете Nokogiri::XML() это сделать (или эквивалент Hpricot), и правила вложенности не будут применяться.

4. Отличная идея. Увы, это не имело никакого значения. (И я пробежал страницу через w3.org валидатор с / doctype xhtml, чтобы убедиться, что у меня есть действительный xml.)

Ответ №1:

Ваш XHTML не является допустимым XHTML. Если я скопирую содержимое из http://pastie.org/2638305 , сохраните их как ‘foo.xhtml’, а затем попытайтесь открыть их в Chrome, я вижу:

Эта страница содержит следующие ошибки:
ошибка в строке 768 в столбце 39: ошибка построения атрибутов

Если я посмотрю на строку 768, то увижу (усеченный):

 <img src="..." alt="Talk to us now!"http://wholesaleinsurance.net/>
  

Как вы можете видеть, это явно не является синтаксически корректным.

Вы утверждаете, что пробежали страницу до конца validator.w3.org , но когда я делаю это с содержимым твоего пирожка, я получаю:

Ошибки, обнаруженные при проверке этого документа как XHTML 1.0 Strict!
Результат: 15 ошибок, 3 предупреждения

So…is ваше фактическое содержание не то, что вы кладете в пирог?

Комментарии:

1. Вы правы насчет строки 768, и я действительно видел ошибки в we.org валидатор, но когда я проверил их, все они были (я думаю) поддельными. Я проигнорировал тот, в котором говорилось «нет атрибута X», и указал код, который не появился в документе. например <iframe src:"http://www.facebook.com... , тогда как документ действительно прочитан <iframe src="http://www.facebook.com . Итак, содержимое страницы — это то, что я поместил в pastie, но, думаю, я не знаю, что делать с этими ошибками.

2. @JellicleCat Я полагаю, вам придется их найти и исправить. Эти ошибки настолько вопиющие, что Nokogiri (или, скорее, libxml2) не знает, как обращаться с супом, который вы в него наливаете. Как насчет пары gsub / регулярных выражений для известных ошибок, чтобы уменьшить объем содержимого?