我最近注意到使用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>
答案 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_html
,inner_text
等方法。
编辑:如果您不希望解析完整,格式良好的XML文档作为输入,那么TheTinMan的答案是最好的。