Cara memilih node dengan mencocokkan teks

Jika saya memiliki banyak elemen seperti:

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

Apakah ada metode bawaan di Nokogiri yang dapat memberi saya semua p elemen yang berisi teks "Apple"? (Contoh elemen di atas akan cocok, misalnya).


person Zando    schedule 24.09.2009    source sumber


Jawaban (4)


Nokogiri dapat melakukan ini (sekarang) menggunakan ekstensi jQuery ke 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"
person the Tin Man    schedule 10.03.2013
comment
jika Anda mengganti bar dengan teks lain seperti: google terenkripsi \google drive\ tahun ini menghasilkan kesalahan, ada ide bagaimana cara keluar dari karakter dengan benar? - person Emad Elsaid; 29.07.2013
comment
Coba gunakan &quot; alih-alih tanda kutip yang disematkan? - person the Tin Man; 30.07.2013
comment
Apakah ada cara untuk melakukan ini tanpa mengetahui jenis elemen apa yang berisi teks? Jika saya melakukan doc.at(':contains("bar")') (yaitu tanpa menentukan elemen p) maka saya mendapatkan seluruh dokumen. - person crantok; 04.10.2018
comment
Tidak apa-apa, saya menemukan jawabannya doc.at(':contains("foo"):not(:has(:contains("foo")))') di sini makandracards.com/makandra/ - person crantok; 04.10.2018

Ini adalah XPath yang berfungsi:

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>
person Aaron Patterson    schedule 25.09.2009

Coba gunakan XPath ini:

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

Anda juga dapat melakukannya dengan sangat mudah menggunakan Nikkou:

doc.search('p').text_includes('bar')
person Tom    schedule 02.06.2013
comment
Hai, terima kasih telah menyarankan nikkou, menurutku ini akan menghemat banyak waktu :) - person whizcreed; 19.06.2013