2011-12-18 37 views
5

natknąłem to HTML:Jak wyodrębnić tekst podrzędny za pomocą 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> 

Chcę wyodrębnić tekst <h1> "How to extract this?". Jak to zrobić?

Próbowałem z następującego kodu, ale jest inny element dołączony. Nie jestem pewien, jak je wykluczyć, więc otrzymuję tylko sam tekst <h1>.

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

Odpowiedz

6

#css zwraca zbierania, wykorzystywania #at_css zdobyć pierwszy węzeł pasujący. Cała jego zawartość, nawet tekst, są dziećmi, w tym przypadku tekst jest jego pierwszym dzieckiem. Możesz również zrobić coś takiego, jak children.reject &element?, jeśli chcesz mieć wszystkie dzieci, które nie są elementami.

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  " 

Alternatywnie, można użyć xpaths:

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

Można użyć tekstu() z selektorów CSS, jak również xpath: .At ('opisywany tekst H1()') tekst – pguardiario

+0

@. pguardiario Nifty. To coś, o czym nie wiedziałem. –

Powiązane problemy