2013-03-27 40 views
4

我剛剛開始與nokogiri從網站抓取信息,無法弄清楚如何完成以下操作。我有一些HTML代碼,我想刮:Nokogiri :: HTML和Ruby的Web Scraping - 如何獲得輸出到數組?

<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 

這給了我這樣一個列表:類型1 - 屏幕上的全部,類型2 - 全部,類型3 - 全部,類型4 - 全部,類型5 - 全部, 。

現在我想在數組中獲取這個值,以便能夠將它保存到CSV文件中。我嘗試了幾件事情,但大部分嘗試都得到'無法將字符串轉換爲數組'的錯誤。 希望有人能幫助我解決這個問題!

回答

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 --> 
' 

與引入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"]] 

從那裏你應該能夠插入到電子郵件CSV類的xamples,並讓它在沒有問題的情況下工作。

現在,你的代碼比較輸出到田裏屏幕這樣的:

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 2013-03-27 16:24:56

相關問題