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

hol*_*den 29 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

我如何防止Nokogiri这样做?

IE,当我这样做:

doc = Nokogiri::HTML("<div>some content</div>")
doc.to_s
Run Code Online (Sandbox Code Playgroud)

要么:

doc.to_html
Run Code Online (Sandbox Code Playgroud)

我得到原件:

<html blah><body>div>some content</div></body></html>
Run Code Online (Sandbox Code Playgroud)

the*_*Man 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>
Run Code Online (Sandbox Code Playgroud)

HTML使用HTML.fragment,告诉Nokogiri您只需要解析片段,而不是使用完整文档中的哪个结果:

doc = Nokogiri::HTML.fragment('<p>foobar</p>')
puts doc.to_html
# >> <p>foobar</p>
Run Code Online (Sandbox Code Playgroud)


Mar*_*mas 5

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

如果你想输出小于一个完整的文件,您使用的方法,例如inner_htmlinner_text等等,一个节点上。

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