2011-12-18 11 views
5

me encontré con este código HTML:¿Cómo extraigo el texto secundario con Nokogiri?

<div class='featured'> 
    <h1> 
     How to extract this? 
     <span>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</span> 
     <span class="moredetail "> 
      <a href="/hello" title="hello">hello</a> 
     </span> 
     <div class="clear"></div> 
    </h1> 
</div> 

Quiero extraer el texto <h1> "How to extract this?". ¿Cómo lo hago?

He intentado con el siguiente código, pero hay otro elemento adjunto. No estoy seguro de cómo excluirlos, así que solo obtengo el texto <h1>.

doc = Nokogiri::HTML(open(url))  
records = doc.css(".featured h1") 

Respuesta

6

#css devuelve una colección, utilice #at_css para obtener el primer nodo coincidente. Todos sus contenidos, incluso el texto, son niños, y en este caso, el texto es su primer hijo. También podría hacer algo como children.reject &element? si quisiera todos los elementos secundarios que no fueran elementos.

data = ' 
<div class="featured"> 
    <h1> 
     How to extract this? 
     <span>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</span> 
     <span class="moredetail "> 
      <a href="/hello" title="hello">hello</a> 
     </span> 
     <div class="clear"></div> 
    </h1> 
</div> 
' 

require 'nokogiri' 
text = Nokogiri::HTML(data).at_css('.featured h1').children.first.text 
text # => "\n  How to extract this?\n  " 

Como alternativa, se pueden utilizar XPaths:

Nokogiri::HTML(data).at_xpath('//*[@class="featured"]/h1/text()').text 
+2

Puede utilizar el texto() con los selectores CSS, así como XPath: .at ('presentados texto h1()') texto – pguardiario

+0

@. pguardiario Nifty. Eso es algo que no sabía. –

Cuestiones relacionadas