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)
a 上的to_s方法Nokogiri::HTML::Document输出一个有效的 HTML 页面,并带有所需的元素。这不一定是传递给解析器的内容。
如果你想输出小于一个完整的文件,您使用的方法,例如inner_html,inner_text等等,一个节点上。
编辑:如果您不希望将完整的、格式良好的 XML 文档解析为输入,那么 theTinMan 的答案是最好的。