2012-05-29 28 views
17

tengo algo de HTML que se parece a:Obtener texto directamente dentro de una etiqueta en Nokogiri

<dt> 
    <a href="#">Hello</a> 
    (2009) 
</dt> 

Ya tengo todo mi HTML cargada en una variable llamada record. Necesito analizar el año, es decir, 2009 si existe.

¿Cómo puedo obtener el texto dentro de la etiqueta dt pero no el texto dentro de la etiqueta a? He usado record.search("dt").inner_text y esto me da todo.

Es una pregunta trivial pero no he logrado resolver esto.

+1

también nota que hay de hecho dos nodos de texto dentro de ese 'dt' (a menos que analizó el HTML usando la opción 'noblanks'): el primer nodo de texto es' "\ n" 'antes de' ', y el segundo nodo de texto es' "\ n (2009) \ n" 'después de él. – Phrogz

Respuesta

16

para obtener todos los hijos directos con texto, pero no los otros sub-hijos, puede utilizar XPath así:

doc.xpath('//dt/text()') 

O si desea utilizar la búsqueda:

doc.search('dt').xpath('text()') 
+3

Los métodos anteriores le dan un nodo NodeSet de ['XML :: Text'] (http://nokogiri.org/Nokogiri/XML/Text.html) nodos; es posible que desee usar 'at_xpath' (o simplemente' at') para obtener un solo resultado, y luego llame a los métodos '.content' o' .text' en ese nodo para obtener el texto como una cadena de él. – Phrogz

5

El elemento dt tiene dos hijos, para que pueda acceder a él a través de:

doc.search("dt").children.last.text 
7

Usando XPath t o seleccione exactamente lo que desea (según lo sugerido por @Casper) es la respuesta correcta.

def own_text(node) 
    # Find the content of all child text nodes and join them together 
    node.xpath('text()').text 
end 

Aquí hay una alternativa, la respuesta diversión :)

def own_text(node) 
    node.clone(1).tap{ |copy| copy.element_children.remove }.text 
end 

visto en acción:

require 'nokogiri' 
root = Nokogiri.XML('<r>hi <a>BOO</a> there</r>').root 
puts root.text  #=> hi BOO there 
puts own_text(root) #=> hi there 
Cuestiones relacionadas