2009-09-24 2 views
35

Se ho un sacco di elementi come:Nokogiri: come selezionare i nodi facendo corrispondere il testo?

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

c'è un costruito nel metodo di nokogiri che mi otterrebbe tutti, per esempio, gli elementi p che contengono il testo "Apple"? (l'elemento di esempio sopra corrisponde, per esempio).

risposta

42

Nokogiri può fare questo (ora) utilizzando le estensioni jQuery ai 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

se è stato sostituito bar con un altro testo come: "Google criptato \" Google Drive \ "quest'anno" si verifica un errore, tutte le idee come sfuggire correttamente il " carattere ? –

+0

Provare a usare '"' anziché le virgolette incorporate? –

5

Provare a utilizzare questo XPath:

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

Ecco un XPath che funziona:

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> 

Speranza che aiuta

5

È anche possibile fare questo molto facilmente con Nikkou:

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

Hey, grazie per avermi suggerito nikkou, ho la sensazione che questo mi farà risparmiare un sacco di tempo :) – whizcreed