在解析HTML文档时,Nokogiri如何处理<br>标签?假设我们的文档看起来像这样:
<div>
Hi <br>
How are you? <br>
</div>
Run Code Online (Sandbox Code Playgroud)
Nokogiri知道<br>标签是特殊的,不仅仅是常规XML标签,在解析节点源时忽略它们吗?我认为Nokogiri很聪明,但我想在接受这个涉及抓取HTML4网站的项目之前确定一下.你知道我的意思(How are you?不是第一个内容,<br>就像在XML中一样).
以下是 Nokogiri 在解析(格式错误的)XML时的行为:
require 'nokogiri'
doc = Nokogiri::XML("<div>Hello<br>World</div>")
puts doc.root
#=> <div>Hello<br>World</br></div>
Run Code Online (Sandbox Code Playgroud)
以下是 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"
Run Code Online (Sandbox Code Playgroud)
我假设“特殊的东西”是指您希望 Nokogiri 将其视为源文本中的换行符。A<br>并不是什么特殊的东西,因此 Nokogiri 不会将其与任何其他元素区别对待。
如果你希望它被视为换行符,你可以这样做:
doc.css('br').each{ |br| br.replace("\n") }
p doc.at('div').text
#=> "Hello\nWorld"
Run Code Online (Sandbox Code Playgroud)
同样,如果您想要一个空格:
doc.css('br').each{ |br| br.replace(" ") }
p doc.at('div').text
#=> "Hello World"
Run Code Online (Sandbox Code Playgroud)
您必须使用 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 }
Run Code Online (Sandbox Code Playgroud)
印刷
<br>
<br>
Run Code Online (Sandbox Code Playgroud)
Mechanize 基于 Nokogiri 进行网页抓取,因此非常适合这项任务。
| 归档时间: |
|
| 查看次数: |
2376 次 |
| 最近记录: |