【问题标题】:How does Nokogiri handle unclosed HTML tags like <br>?Nokogiri 如何处理未闭合的 HTML 标签,如 <br>?
【发布时间】:2011-08-19 14:11:53
【问题描述】:

解析HTML文档时,Nokogiri如何处理&lt;br&gt;标签?假设我们有一个看起来像这样的文档:

<div>
   Hi <br>
   How are you? <br>
</div>

Nokogiri 是否知道&lt;br&gt; 标签是特殊的,而不仅仅是常规的 XML 标签,并且在解析节点提要时忽略它们?我认为 Nokogiri 很聪明,但在我接受这个涉及以 HTML4 编写的抓取网站的项目之前,我想确定一下。你知道我的意思(How are you? 不是第一个 &lt;br&gt; 的内容,就像它在 XML 中那样)。

【问题讨论】:

  • 你能澄清你的期望(或试图避免)吗?例如,您是否要确保“div”元素的文本是“Hi How are you?”而不仅仅是“嗨”和“你好吗?”是第一个“&lt;br&gt;”元素的文本吗?

标签: ruby nokogiri


【解决方案1】:

您必须使用 HTML 解析器来解析这个片段,因为这显然不是有效的 XML。使用 HTML 时,Nokogiri 的行为会如您所愿:

require 'nokogiri'

doc = Nokogiri::HTML(<<-EOS
<div>
   Hi <br>
   How are you? <br>
</div>
EOS
)

doc.xpath("//br").each{ |e| puts e }

打印

<br>
<br>

Mechanize 基于 Nokogiri 进行网页抓取,因此非常适合该任务。

【讨论】:

  • 我不确定你和我“期望”它做什么与 OP 期望的一样。问题中的陈述 "...&lt;br&gt; tags are something special [...] ignore them when parsing the node feed" 不是 Nokogiri 所做的,但似乎是 Kreeki 所希望的为。
  • 确实,感谢您指出这一点!让解析器返回它们意味着可以处理它们,而不必进行字符串替换,这是我试图暗示的。如果 OP 想忽略它们,那么就像 doc.xpath("//div").each { |e| puts e.text }.
【解决方案2】:

以下是 Nokogiri 在解析(格式错误)XML时的行为方式:

require 'nokogiri'
doc = Nokogiri::XML("<div>Hello<br>World</div>")
puts doc.root
#=> <div>Hello<br>World</br></div>

以下是 Nokogiri 在解析 HTML 时的行为方式:

require 'nokogiri'
doc = Nokogiri::HTML("<div>Hello<br>World</div>")
puts doc.root
#=> <html><body><div>Hello<br>World</div></body></html>

p doc.at('div').text
#=> "HelloWorld"

我假设“一些特别的东西”是指您希望 Nokogiri 将其视为源文本中的换行符。 &lt;br&gt; 不是什么特别的东西,因此 Nokogiri 确实将它与任何其他元素区别对待。

如果您希望它被视为换行符,您可以这样做:

doc.css('br').each{ |br| br.replace("\n") }
p doc.at('div').text
#=> "Hello\nWorld"

同样,如果您想要一个空格:

doc.css('br').each{ |br| br.replace(" ") }
p doc.at('div').text
#=> "Hello World"

【讨论】:

    【解决方案3】:

    据我记忆,去年做了一些 HTML 解析,它会将它们视为单独的。

    编辑:我的错,我刚刚有人将代码发送给我并重新测试了它,我们最终分别处理了包括&lt;br&gt;在内的一些东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多