【问题标题】:Unclosed tags and Nokogiri未封闭的标签和 Nokogiri
【发布时间】:2010-12-08 16:40:10
【问题描述】:

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

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

【问题讨论】:

  • 以前从未看过这个,但看了一眼文档,我猜“使用 Nokogiri::HTML 解析 HTML 并留下 Nokogiri::XML 解析 XML”(注意 XHTML 不是格式良好是不适合 XML 解析器的无效憎恶)。 (但这只是猜测)
  • 谢谢,但Nokogiri::HTML 只解析 HTML 标头。
  • 实际上,我认为你是对的,大卫。我的问题似乎与 libxml 的版本有关。在带有 libxml 2.7.7 的系统上,Nokogiri::HTML 可以工作,但在带有 libxml 2.6.26 的系统上,它只返回 html 标签。
  • libxml 存在一些影响 Nokogiri 解析能力的错误。以前版本的 Nokogiri 会发出一条抱怨它的消息,直到您承认问题不是 Nokogiri 的问题,而是在 libxml 中。所以,尝试升级 libxml 是个好主意。

标签: html ruby xml parsing nokogiri


【解决方案1】:

试试这个:

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 符合,你可以覆盖它。

【讨论】:

    【解决方案2】:
    @doc = Nokogiri::HTML.parse(f)
    @doc.at('#qcbody').to_html
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多