Nokogiri如何处理未包含的HTML标签?

时间:2011-08-19 14:11:54

标签: ruby nokogiri

解析HTML文档时,Nokogiri如何处理<br>标记?假设我们的文档看起来像这样:

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

Nokogiri是否知道<br>标签不仅仅是常规XML标签,而且在解析节点源时会忽略它们?我认为Nokogiri很聪明,但我想在接受这个涉及抓取HTML4网站的项目之前确定一下。你知道我的意思(How are you?不是第一个<br>的内容,就像在XML中一样。

3 个答案:

答案 0 :(得分:4)

您必须使用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进行网络抓取,所以它非常适合这项任务。

答案 1 :(得分:3)

以下是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将其视为源文本中的换行符。 <br>

如果您希望将其视为换行符,则可以执行以下操作:

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"

答案 2 :(得分:-1)

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

编辑:我的不好,我只是派人给我发送代码并重新测试,最后我们分别处理了包括<br>在内的某些事情。