2009-09-24 3 views
35

Если у меня есть куча элементов, как:Nokogiri: Как выбрать узлы по тексту?

<p>A paragraph <ul><li>Item 1</li><li>Apple</li><li>Orange</li></ul></p> 

Есть ли встроенный nokogiri метод, который получил бы мне все, например, п элементов, содержащих текст «Яблоко»? (например, примерный элемент соответствовал бы).

ответ

42

Nokogiri может сделать это (сейчас) с помощью расширений JQuery в CSS:

require 'nokogiri' 

html = ' 
<html> 
    <body> 
    <p>foo</p> 
    <p>bar</p> 
    </body> 
</html> 
' 

doc = Nokogiri::HTML(html) 
doc.at('p:contains("bar")').text.strip 
=> "bar" 
+0

если вы заменили бар с другим текстом, как: «Google шифруется \» Google Диск \ «в этом году» он выдает ошибку, любые идеи, как правильно спасаясь от " персонаж ? –

+0

Попробуйте использовать '"' вместо встроенных кавычек? –

5

Попробуйте использовать этот XPath:

p = doc.xpath('//p[//*[contains(text(), "Apple")]]') 
45

Вот XPath, который работает:

require 'nokogiri' 

doc = Nokogiri::HTML(DATA) 
p doc.xpath('//li[contains(text(), "Apple")]') 

__END__ 
<p>A paragraph <ul><li>Item 1</li><li>Apple</li><li>Orange</li></ul></p> 

Надежда, что помогает

5

Вы также можете сделать это очень легко с Nikkou:

doc.search('p').text_includes('bar') 
+0

Эй, спасибо за предложение nikkou, у меня такое чувство, это сэкономит мне много времени :) – whizcreed

Смежные вопросы