Почему Nokogiri не находит этот тег img? - PullRequest
0 голосов
/ 22 апреля 2020

Я начинаю с:

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>"

Я разобрал его во фрагмент Нокогири:

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

Однако оба следующих возвращают пустой список:

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' предназначено для рекурсивного поиск

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я избегаю 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 - это рекурсивный поиск, он начинается в верхней части документа и опускается.

0 голосов
/ 22 апреля 2020

Кажется, это открытая проблема, что фрагменты не находят элементы с ожидаемым выражением xpath ...

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

, но это будет работать ...

f.xpath('.//img')
...