2015-11-23 82 views
1

這是我正在使用的文檔的一部分的模型。我想要做的是先找到時間和成本要素,然後從中找到它們各自的價值。我試過各種軸選擇器,但沒有任何地方。我不直接去找時間和成本元素,我需要找到他們與他們相關的h4s。Scrapy:穿越文檔

<ul class="events"> 
    <li id="event-123456" class=eventItem> 
    <div class="details">     
     <h4>Time</h4> 
     <div> 
     <p>17:00</p> 
     </div> 
     <h4>Cost</h4> 
     <div> 
     <p>10.00</p> 
     </div> 
    </div> 
    </li> 
    <li id="event-678901" class=eventItem> 
    <div class="details">     
     <h4>Time</h4> 
     <div> 
     <p>21:00</p> 
     </div> 
     <h4>Cost</h4> 
     <div> 
     <p>20.00</p> 
     </div> 
    </div> 
    </li> 
</ul> 

這是解析器

def parse(self, response): 
     Events = response.xpath('//ul') 
     for event in Events: 
      item['cost'] = event.xpath(???) 
      item['time'] = event.xpath(???) 

回答

1

following-sibling將幫助這裏的骨架:

events = response.xpath('//ul[@class = "events"]/li') 
for event in events: 
    item = MyItem() 

    item['cost'] = event.xpath(".//h4[. = 'Cost']/following-sibling::div/p/text()").extract_first() 
    item['time'] = event.xpath(".//h4[. = 'Time']/following-sibling::div/p/text()").extract_first() 

    yield item 
+1

這並不完全正確。 'event.xpath(「.// h4 [。='Time']/following-sibling :: div/p/text()」)'會返回一個帶有2個選擇器的SelectorList,而不是一個。除非結合'.extract_first()'(這可能是你的意思),否則你需要用'.h4 [ ='時間'] /下列兄弟:: div [1]/p/text()' –

+0

@paultrmbrth謝謝,好點。 – alecxe