Нокогири не в тексте содержит - PullRequest
0 голосов
/ 25 ноября 2011

Я пытаюсь извлечь текст из HTML.

doc = Nokogiri::HTML('<B> <A href="http://www.asl.com/foo/bar"> Status :</A></B> REGISTERED <BR>')

puts doc.search('//b').first.text
puts doc.search('//b[contains(text(),"Status")]/following-sibling::text()[1]').first.text

первый клад возвращает Status : Но второй пут бросает исключение undefined method 'text' for nil:NilClass

Почему contains не выполняет поиск должным образом? или я что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Я думаю, вы неправильно поняли функцию text в XPath. В отличие от функции DOM, она не возвращает объединенную строку всех текстовых подузлов. Вместо этого он выбирает отдельные текстовые узлы.

В вашем примере //text() выберет три текстовых узла:

 [" ", " Status :", " REGISTERED "]

Что вам может понадобиться, это выражение XPath:

//b/a[contains(text(),"Status")]/../following-sibling::text()[1]

По сути, он находит элемент a, имеющий правильный текстовый узел, затем подходит к родительскому элементу (b) и затем получает свой родственный текстовый узел.

1 голос
/ 25 ноября 2011

«Status:» на самом деле не текстовый узел внутри <B></B>, это текстовый узел внутри <A></A>.

doc.search('//b/a[contains(text(),"Status")]/text()[1]').first.text

У меня работает.

...