2009-09-24 9 views
35

Si tengo un montón de elementos como:Nokogiri: cómo seleccionar nodos al hacer coincidir el texto?

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

¿Hay una construida en el método nokogiri que me llevaría a todos los elementos, por ejemplo, p que contienen el texto "Apple"? (el elemento de ejemplo anterior coincidiría, por ejemplo).

Respuesta

42

Nokogiri puede hacer esto (ahora) el uso de extensiones de jQuery a 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

si reemplazó bar con otro texto como: "Google encriptado \" Google Drive \ "este año" se produce un error, alguna idea de cómo escapar correctamente la " personaje ? –

+0

Intenta usar '"' en lugar de las comillas incrustadas? –

5

Trate de usar este XPath:

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

Aquí es un XPath que funciona:

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> 

Espero que ayude

5

También puede hacer esto muy fácilmente con Nikkou:

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

Hola, gracias por sugerir a Nikkou, tengo la sensación de que esto me ahorrará mucho tiempo :) – whizcreed

Cuestiones relacionadas