2013-03-27 2 views
4

Я только что начал с nokogiri, чтобы очистить информацию от сайта и не могу понять, как сделать следующее. У меня есть некоторые HTML код, который я хочу, чтобы скоблить:Веб-скребок с помощью Nokogiri :: HTML и Ruby - Как получить выход в массив?

<div class="compatible_vehicles"> 
    <div class="heading"> 
    <h3>Compatible Vehicles</h3> 
    </div><!-- .heading --> 
    <ul> 
      <li> 
     <p class="label">Type1</p> 
     <p class="data">All</p> 
    </li> 
    <li> 
     <p class="label">Type2</p> 
     <p class="data">All</p> 
    </li> 
    <li> 
     <p class="label">Type3</p> 
     <p class="data">All</p> 
    </li> 
    <li> 
     <p class="label">Type4</p> 
     <p class="data">All</p> 
    </li> 
    <li> 
     <p class="label">Type5</p> 
     <p class="data">All</p> 
    </li> 
    </ul> 
    </div><!-- .compatible_vehicles --> 

И мне удалось получить выход, я хочу на моем экране с этим:

i = 0 
    doc.css('div > .compatible_vehicles > ul > li').each do |item| 
     label = item.at_css(".label").text 
     data = item.at_css(".data").text 
    print "#{label} - #{data}" + ',' 
    end 
    i += 1 

Это дает мне список, как это: Type1 - Все, Тип2 - Все, Тип3 - Все, Тип4 - Все, Тип5 - Все, на экране.

Теперь я хочу получить это значение в массиве, чтобы сохранить его в CSV-файле. Я пробовал несколько вещей, но большинство попыток получаю ошибку «Не могу преобразовать String в Array». Надеюсь, кто-то может помочь мне с этим!

ответ

2

Начиная с HTML:

html = ' 
<div class="compatible_vehicles"> 
    <div class="heading"> 
     <h3>Compatible Vehicles</h3> 
    </div><!-- .heading --> 
    <ul> 
     <li> 
     <p class="label">Type1</p> 
     <p class="data">All</p> 
     </li> 
     <li> 
     <p class="label">Type2</p> 
     <p class="data">All</p> 
     </li> 
     <li> 
     <p class="label">Type3</p> 
     <p class="data">All</p> 
     </li> 
     <li> 
     <p class="label">Type4</p> 
     <p class="data">All</p> 
     </li> 
     <li> 
     <p class="label">Type5</p> 
     <p class="data">All</p> 
     </li> 
    </ul> 
</div><!-- .compatible_vehicles --> 
' 

PARSING его с Nokogiri и обхвата над <li> тегов, чтобы получить их <p> содержимое тега:

require 'nokogiri' 

doc = Nokogiri::HTML(html) 
data = doc.search('.compatible_vehicles li').map{ |li| 
    li.search('p').map { |p| p.text } 
} 

Возвращает массив массивов:

=> [["Type1", "All"], ["Type2", "All"], ["Type3", "All"], ["Type4", "All"], ["Type5", "All"]] 

Оттуда вы должны быть в состоянии подключить это к e xamples для класса CSV и заставить его работать без проблем.

Теперь сравните свой код выхода на поля на экране следующим образом:

data.map{ |a| a.join(' - ') }.join(', ') 
=> "Type1 - All, Type2 - All, Type3 - All, Type4 - All, Type5 - All" 

Все, что я должен был бы сделать, это puts и было бы напечатать правильно.

Очень важно подумать о возврате полезных структур данных. В Ruby хеши и массивы очень полезны, потому что мы можем перебирать их и массировать их во многих формах. Было бы тривиальным, из массива массивов, чтобы создать хэш:

Hash[data] 
=> {"Type1"=>"All", "Type2"=>"All", "Type3"=>"All", "Type4"=>"All", "Type5"=>"All"} 

Что бы сделать это очень легко сделать поиск.

+0

Отлично, все! Спасибо за помощь! – user2215918

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