我的测试html文件位于:http://pastebin.com/L88nYbQY
正如您所看到的,有一些未闭合的输入标签,以及一些自我关闭的标签。
这会导致以下代码返回从打开#qcbody div到文件末尾的所有内容,忽略结束div标记。
require 'nokogiri'
f = File.open('t.html', 'r')
@doc = Nokogiri::XML(f)
@doc.at_css('#qcbody').to_html
我确信人们已经以各种方式解决了这个问题。你会怎么做?
答案 0 :(得分:2)
尝试一下:
require 'open-uri'
require 'nokogiri'
@doc = Nokogiri::HTML(File.open('t.html', 'r'))
@doc.at_css('#qcbody').to_html
在IRB:
>> @doc.at_css('#qcbody').to_html
=> "<div id="qcbody"> \r\n <form method="post" name="form" id="form" action="#">\r\n <input type="hidden" name="Search Engine" id="Search Engine"><input type="hidden" name="Keyword" id="Keyword"><input type="button" onclick="javascript:validate()" name="sendsubmit" id="sendsubmit" class="submit">\n</form>\r\n <div class="clear"></div>\r\n </div>"
使用Nokogiri::XML
和Nokogiri::HTML
之间的区别在于解析文档时的宽大处理。需要XML来验证和正确。某些XML解析器会拒绝不符合标准的XML文件。 Nokogiri允许我们设定它是多么挑剔。 (在XML的情况下,您可以在解析后查看errors
数组以查看是否存在问题。)
对于HTML,Nokogiri放松了解析器,因此处理真实HTML的机会更大。我已经看到它处理了一些非常丑陋的标记,并在较小的解析器吹嘘午餐时继续前进。如果您查看Nokogiri::HTML.parse
已定义options = XML::ParseOptions::DEFAULT_HTML
,则这些是放宽设置。如果要确保HTML符合,可以覆盖它。
答案 1 :(得分:1)
@doc = Nokogiri::HTML.parse(f)
@doc.at('#qcbody').to_html