Nokogiri如何处理像?一样的未封闭HTML标签?

Kre*_*eki 5 ruby nokogiri

在解析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中一样).

Phr*_*ogz 5

以下是 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)


Séb*_*nec 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 }
Run Code Online (Sandbox Code Playgroud)

印刷

<br>
<br>
Run Code Online (Sandbox Code Playgroud)

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