2013-08-20 81 views
1

我有這樣的代碼:基於其他相鄰元素的文本刮取數據?

<div id="left"> 
    <div id="leftNav"> 
     <div id="leftNavContainer"> 
     <div id="refinements"> 
      <h2>Department</h2> 

      <ul id="ref_2975312011"> 
      <li> 
       <a href="#"> 
       <span class="expand">Pet Supplies</span> 
       </a> 
      </li> 

      <li> 
       <strong>Dogs</strong> 
      </li> 

      <li> 
       <a> 
       <span class="refinementLink">Carriers &amp; Travel Products</span> 
       <span class="narrowValue">&nbsp;(5,570)</span> 
       </a> 
      </li> 


(etc...) 

我敢scriping這樣的:

html  = file 
data  = Nokogiri::HTML(open(html)) 
categories = data.css('#ref_2975312011') 

@categories_hash = {} 
categories.css('li').drop(2).each do | categories | 
    categories_title = categories.css('.refinementLink').text 
    categories_count = categories.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
    @categories_hash[:categories] ||= {} 
    @categories_hash[:categories]["Dogs"] ||= {} 
    @categories_hash[:categories]["Dogs"][categories_title] = categories_count 
end 

所以現在。我想要做同樣的事情,但不使用#ref_2975312011和「狗」。

所以我想我可以告訴引入nokogiri如下:

報廢li元素(從第三個開始)等也都通過一個鏈接包圍的文字寵物用品li元素右下 和一個span標籤。

任何想法如何實現?

+0

'?你能否清楚你的需求?我仍然不清楚你需要的是敵人.. –

+0

@Babai那部分我已經完成了。用'drop(2)'。基本上它是通過'li'元素循環並放棄前兩個元素。 – alexchenco

+0

沒關係..我只是想更清楚地知道你的新需求,所以如果可能的話,我可以幫你.. :) –

回答

2

的寵物用品li是:

puts doc.at('li:has(a span[text()="Pet Supplies"])') 

下面的兄弟li的是(跳過第一個):你說的'從第三個開始的意思

puts doc.search('li:has(a span[text()="Pet Supplies"]) ~ li:gt(1)') 
+0

好的..這是OP正在尋找..現在我明白了。好..然後:) –

+0

或者在XPath中:'next_lis = doc.xpath(「// li [a [span ='Pet Supplies']]/following-sibling :: li」)' – Phrogz