วิธีเลือกโหนดด้วยข้อความที่ตรงกัน

หากฉันมีองค์ประกอบหลายอย่างเช่น:

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

มีวิธีการในตัวใน Nokogiri ที่จะรับองค์ประกอบ p ทั้งหมดที่มีข้อความ "Apple" ให้ฉันหรือไม่ (องค์ประกอบตัวอย่างด้านบนจะตรงกัน เป็นต้น)


person Zando    schedule 24.09.2009    source แหล่งที่มา


คำตอบ (4)


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"
person the Tin Man    schedule 10.03.2013
comment
หากคุณแทนที่ bar ด้วยข้อความอื่นเช่น: google encrypted \google drive\ ปีนี้ทำให้เกิดข้อผิดพลาด มีแนวคิดใดบ้างที่จะหลีกเลี่ยงอักขระได้อย่างถูกต้อง - person Emad Elsaid; 29.07.2013
comment
ลองใช้ &quot; แทนเครื่องหมายคำพูดแบบฝังใช่ไหม - person the Tin Man; 30.07.2013
comment
มีวิธีใดบ้างในการทำเช่นนี้โดยไม่รู้ว่าข้อความนั้นมีองค์ประกอบประเภทใด ถ้าฉันทำ doc.at(':contains("bar")') (เช่น โดยไม่ระบุองค์ประกอบ p) ฉันจะได้รับเอกสารทั้งหมด - person crantok; 04.10.2018
comment
ไม่เป็นไร ฉันพบคำตอบ doc.at(':contains("foo"):not(:has(:contains("foo")))') ที่นี่ makandracards.com/makandra/ - person crantok; 04.10.2018

นี่คือ 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>
person Aaron Patterson    schedule 25.09.2009

ลองใช้ XPath นี้:

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

คุณยังสามารถทำสิ่งนี้ได้อย่างง่ายดายด้วย Nikkou:

doc.search('p').text_includes('bar')
person Tom    schedule 02.06.2013
comment
สวัสดี ขอบคุณที่แนะนำ nikkou ฉันรู้สึกว่าสิ่งนี้จะช่วยฉันประหยัดเวลาได้มาก :) - person whizcreed; 19.06.2013