2013-05-26 52 views
0

我試圖根據鏈接和名稱所在組之外的標籤來組織鏈接和名稱的列表。它的設置,像這樣:如何根據外部標籤匹配來抓取內容?

<h4>Volkswagen</h4> 
<ul> 
    <li><a href="http://beetle.cars.com">beetle</a></li> 
</ul> 

<h4>Chevy</h4> 
<ul> 
    <li><a href="http://volt.cars.com">Volt/Electric</a></li> 
</ul> 

我需要的是得到的結果是與名稱爲紐帶以下格式最終但我能做到這一點以後,如果我可以只得到妥善安排的項目。

每個汽車品牌都可能有多種不同的車型。我需要組織他們汽車品牌:

Volkswagen 
    Beetle Link Beetle 
    Jetta Link Jetta 

Chevy 
    Volt Link Volt/Electric 
    S10 Link S10 

我可以得到沒有問題的品牌名單。由於<h4>標籤沒有嵌套,所以我不知道如何將它們與以下<ul>汽車列表相關聯,因此我只是很難將一批模型與每個品牌相關聯。

回答

0

我寧願直接下潛到每一輛汽車,然後再返回來提取車的品牌:

cars = Hash.new { |h, k| h[k] = [] } 

doc.xpath('//ul/li/a').each do |car| 
    brand = car.at('../../preceding-sibling::h4[1]').text 
    cars[brand] << {link: car['href'], name: car.text} 
end 

注意,哈希與塊指定默認值是一個數組初始化。這允許附加哈希(通過<<),如圖所示。 XPath ../../preceding-sibling::h4[1]說:回到ul的水平,回頭看第一個h4。這是該車的相應品牌。

輸出:

{"Volkswagen"=>[ 
       {:link=>"http://beetle.cars.com", :name=>"beetle"} 
       # others here 
       ], 
"Chevy"=>[ 
      {:link=>"http://volt.cars.com", :name=>"Volt/Electric"} 
      # others here 
      ] 
} 

我覺得這個技術好和簡單,只有一個循環。不是每個人都喜歡這種風格。