web-dev-qa-db-ja.com

のこぎり:テキストを照合してノードを選択する方法は?

私のような要素がたくさんある場合:

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

たとえば、「Apple」というテキストを含むp要素をすべて取得する組み込みのnokogiriメソッドはありますか? (たとえば、上の例の要素は一致します)。

45
Zando

Nokogiriは、CSSのjQuery拡張機能を使用してこれを(今)実行できます。

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

動作する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>

それが役に立てば幸い

49
Aaron Patterson

Nikko を使用してこれを非常に簡単に行うこともできます。

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

このXPathを使用してみてください。

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