2011-12-18 5 views
5

Я столкнулся с этим HTML:Как извлечь дочерний текст с помощью 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> 

Я хочу, чтобы извлечь <h1> текст "How to extract this?". Как мне это сделать?

Я пробовал использовать следующий код, но есть и другой элемент. Я не уверен, как их исключить, поэтому я получаю только текст <h1>.

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

ответ

6

#css возвращает коллекцию, используйте #at_css, чтобы получить первый узел согласования. Все его содержимое, даже текст, являются дочерними, и в этом случае текст является его первым ребенком. Вы также можете сделать что-то вроде children.reject &element?, если хотите, чтобы все дети были не элементами.

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  " 

В качестве альтернативы, вы можете использовать XPaths:

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

Вы можете использовать текст() с помощью CSS селекторов, а также XPATH: .at ('признаки h1 текста()') текст – pguardiario

+0

@. pguardiario Nifty. Это то, чего я не знал. –

Смежные вопросы