Как запретить Nokogiri добавлять теги <DOCTYPE>? - PullRequest
29 голосов
/ 18 января 2011

Я недавно заметил кое-что странное, используя Нокогири.Весь HTML-код, с которым я разбирался, получил начальные и конечные теги <html> и <body>.

<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n

Как я могу предотвратить это от Nokogiri?

IE, когдаЯ делаю:

doc = Nokogiri::HTML("<div>some content</div>")
doc.to_s

или:

doc.to_html

Я получаю оригинал:

<html blah><body>div>some content</div></body></html>

Ответы [ 2 ]

80 голосов
/ 19 июня 2011

Проблема возникает из-за того, что вы используете неправильный метод в Nokogiri для анализа вашего контента.

require 'nokogiri'

doc = Nokogiri::HTML('<p>foobar</p>')
puts doc.to_html
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body><p>foobar</p></body></html>

Вместо того, чтобы использовать HTML, что приводит к полному документу, используйте HTML.fragment, который говорит Нокогири, что вы хотите только разобрать фрагмент:

doc = Nokogiri::HTML.fragment('<p>foobar</p>')
puts doc.to_html
# >> <p>foobar</p>
3 голосов
/ 18 января 2011

Метод to_s на Nokogiri::HTML::Document выводит действительную HTML-страницу с необходимыми элементами.Это не обязательно то, что было передано в синтаксический анализатор.

Если вы хотите вывести менее полного документа, вы используете такие методы, как inner_html, inner_text и т. Д., На узле.1007 *

Редактировать: если вы не собираетесь анализировать полный, правильно сформированный XML-документ в качестве входных данных, то ответ от TinMan будет лучшим.

...