为什么 Nokogiri 找不到这个 img 标签?

Why is Nokogiri not finding this img tag?

我开始于:

text = "Dear Harry,<div>Hope all is well with you in the current strange times, and that you are not suffering too much in isolation.Look what I just got delivered:<img class=\"small\" src=\"s\"></div>"

我把它解析成Nokogiri片段:

f = Nokogiri::HTML::DocumentFragment.parse(text)

但是,下面两个return空列表:

f.xpath('//img')

f.xpath('img')

我也不知道为什么。

但是,我可以找到这样的 img 标签:

 f.xpath('*')[0].xpath('img')

 => [#<Nokogiri::XML::Element:0x3fd63d7731cc name="img" attributes=[#<Nokogiri::XML::Attr:0x3fd63d772c68 name="class" value="small">, #<Nokogiri::XML::Attr:0x3fd63d772c54 name="src" value="s">]>] 

我以为 '//img' 是为了进行递归搜索?

片段找不到具有预期 xpath 表达式的元素似乎是一个悬而未决的问题...

https://github.com/sparklemotion/nokogiri/issues/572

但这会起作用...

f.xpath('.//img')

我大部分时间都避免使用 XPath。 CSS 更具可读性,适用于我们所做的大部分事情:

require 'nokogiri'

text = 'foo<div>bar<img class="small" src="s"></div>'
fragment = Nokogiri::HTML::DocumentFragment.parse(text)
fragment.at('img').to_html
# => "<img class=\"small\" src=\"s\">"

或者,使用常规解析成完整文档,然后 CSS 或 XPath 都可以:

doc = Nokogiri::HTML(text)
doc.at('img').to_html # => "<img class=\"small\" src=\"s\">"
doc.at('//img').to_html # => "<img class=\"small\" src=\"s\">"

//... 在 XPath 中是递归搜索,它从文档的顶部开始并下降。