未封闭的标签和Nokogiri

时间:2010-12-08 16:40:11

标签: html ruby xml parsing nokogiri

我的测试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

我确信人们已经以各种方式解决了这个问题。你会怎么做?

2 个答案:

答案 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::XMLNokogiri::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