解析HTML文档时,Nokogiri如何处理<br>
标记?假设我们的文档看起来像这样:
<div>
Hi <br>
How are you? <br>
</div>
Nokogiri是否知道<br>
标签不仅仅是常规XML标签,而且在解析节点源时会忽略它们?我认为Nokogiri很聪明,但我想在接受这个涉及抓取HTML4网站的项目之前确定一下。你知道我的意思(How are you?
不是第一个<br>
的内容,就像在XML中一样。
答案 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>
在内的某些事情。