web-dev-qa-db-fra.com

Nokogiri: Comment sélectionner les nœuds en faisant correspondre le texte?

Si j'ai un tas d'éléments comme:

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

Existe-t-il une méthode nokogiri intégrée qui me procurerait tous, par exemple, des éléments p contenant le texte "Apple"? (l'exemple d'élément ci-dessus correspondrait, par exemple).

45
Zando

Nokogiri peut le faire (maintenant) en utilisant des extensions jQuery en 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"
53
the Tin Man

Voici un XPath qui fonctionne:

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>

J'espère que cela pourra aider

49
Aaron Patterson

Vous pouvez également le faire très facilement avec Nikko :

doc.search('p').text_includes('bar')
6
Tom

Essayez d'utiliser ce XPath:

p = doc.xpath('//p[//*[contains(text(), "Apple")]]')
5
andre-r