如何防止Nokogiri添加<doctype>标签?</doctype>

时间:2011-01-18 11:08:47

标签: ruby-on-rails ruby nokogiri

我最近注意到使用Nokogiri的一些奇怪的事情。我解析过的所有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这样做?

I.E。,当我这样做时:

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

或:

doc.to_html

我得到了原文:

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

2 个答案:

答案 0 :(得分:80)

问题出现是因为您在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,而告诉Nokogiri你只需要解析片段:

doc = Nokogiri::HTML.fragment('<p>foobar</p>')
puts doc.to_html
# >> <p>foobar</p>

答案 1 :(得分:3)

to_s上的Nokogiri::HTML::Document方法会输出一个有效的HTML页面,并附带所需的元素。这不一定是传递给解析器的内容。

如果您想输出少于完整的文档,请在节点上使用inner_htmlinner_text等方法。

编辑:如果您不希望解析完整,格式良好的XML文档作为输入,那么TheTinMan的答案是最好的。