2015-10-12 3 views
0

У меня есть список пунктов:Получить HTML атрибуты из цикла

<div class="item"> 
    <a href="//external-link.com"> 
     <img src="main-image.jpg" alt=""/> 
    </a> 
    <h2> Title </h2> 
    <p> Description lorem here </p> 
</div> 
<div class="item"> 
    <a href="//external-link.com"> 
     <img src="main-image.jpg" alt=""/> 
    </a> 
    <h2> Title </h2> 
    <p> Description lorem here </p> 
</div> 
<div class="item"> 
    <a href="//external-link.com"> 
     <img src="main-image.jpg" alt=""/> 
    </a> 
    <h2> Title </h2> 
    <p> Description lorem here </p> 
</div> 

Я хочу, чтобы извлечь текст <h2> тега, и «SRC» и «HREF» из <a> и <img> тегов, но Я не могу понять, как извлечь атрибуты «src» и «href».

Это что-то вроде того, что я использую:

require 'nokogiri' 
require 'open-uri' 

pageURL = 'http://ticketdriver.com/amg/buy/tickets' 
page = Nokogiri::HTML(open(pageURL), nil, 'UTF-8') 

page.css('.item').each do |node| 
    title = node.css('h2').text 
    srcUrl = node.css('img')['src'] 
end 

text часть работает, но я не могу получить доступ к ключу и значение для дочерних элементов «.item». Я пробовал children[0], [0]['src'], [:src], attr(), attribute() и еще несколько.

У меня полно идей и страниц поиска Google.

+0

Добро пожаловать в переполнение стека. Пожалуйста, избегайте использования приветствий («Привет, я новичок в Ruby and nokogiri.»), Валидации или подписи. Stack Overflow - это не разговор, вместо этого мы пишем статьи о том, как решать проблемы. –

ответ

0

Я хотел бы сделать что-то вроде:

doc = Nokogiri::HTML(<<EOT) 
<html><body> 
    <div class="item"> 
     <a href="//external-link.com"> 
      <img src="main-image1.jpg" alt=""/> 
     </a> 
     <h2> Title1 </h2> 
    </div> 
    <div class="item"> 
     <a href="//external-link.com"> 
      <img src="main-image2.jpg" alt=""/> 
     </a> 
     <h2> Title2 </h2> 
    </div> 
    <div class="item"> 
     <a href="//external-link.com"> 
      <img src="main-image3.jpg" alt=""/> 
     </a> 
     <h2> Title3 </h2> 
    </div> 
</body></html> 
EOT 

items = doc.search('.item').map { |item| 
    { 
    title: item.at('h2').text, 
    src: item.at('img')['src'] 
    } 
} 

что приводит:

items 
# => [{:title=>" Title1 ", :src=>"main-image1.jpg"}, 
#  {:title=>" Title2 ", :src=>"main-image2.jpg"}, 
#  {:title=>" Title3 ", :src=>"main-image3.jpg"}] 

Я намеренно только получаю "SRC" атрибут из <img> тега. Учитывая приведенный выше код, вы можете выяснить, как получить то, что вы хотите от тегов <a>.

Обратите внимание, что я использую общий search, а не css. Nokogiri достаточно умен, чтобы проводить различие между CSS и селекторами XPath большую часть времени. Единственный раз, когда я использую либо css, либо xpath, когда Нокигири не может понять это. Я использую CSS, потому что он обычно проще и легче читать.

Также обратите внимание, что я не использую node.css('h2').text. css возвращает NodeSet, который сродни массиву, тогда как at возвращает один узел. В вашем коде вы маскируете разницу между двумя, но используя css, xpath или общий search - ошибка в ожидании. Рассмотрим это:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html><body> 
    <p>foo</p> 
    <p>bar</p> 
    <p>baz</p> 
</body></html> 
EOT 

doc.search('p').text # => "foobarbaz" 
doc.at('p').text # => "foo" 

Что это означает, если search или один из его специфических методов возвращает NodeSet, text вернет текст всех узлов в этом наборе, который редко бывает, что вы хотите. Вместо этого вам нужно использовать at, чтобы найти нужный дочерний узел, а затем извлечь его текст. Как вы это делаете, это другой вопрос, но это легко сделать.

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