2015-10-20 59 views
0

我試圖抓取包含電視指南(電影與他們的頻道和開始時間)的網頁。網頁的結構如下所示:For循環在Scrapy中多次返回完整響應

<div class="grid__col__inner"> 
    <div class="tv-guide__channel"> 
     <h6> 
      <a href="./tv-gids/2be/vandaag">2BE</a> 
     </h6> 
    </div> 
    <div class="program"> 
     <div class="time">22:20</div> 
     <div class="title"><a href="./2be/vandaag/knowing">Knowing</a></div> 
    </div> 
</div> 

該網頁有多個grid__col__inner div。每個頻道一個。每個頻道可以包含多個電影。

我寫蜘蛛與Scrapy框架如下:

def parse(self, response): 
     for col_inner in response.xpath('//div[@class="grid__col__inner"]'): 
      chnl = col_inner.xpath('//div[@class="tv-guide__channel"]/h6/a/text()').extract() 
      for program in col_inner.xpath('//div[@class="program"]'): 
       item = TVGuideItem() 
       item['channel'] = chnl 
       item['start_ts'] = program.xpath('//div[@class="time"]/text()').extract() 
       item['title'] = program.xpath('//div[@class="title"]/a/text()').extract() 
       yield item 

因爲在grid__col__inner DIV頻道名稱被只提一次,我首先提取它並把它分配給每個項目(電影)。

當我運行此代碼時,它會爲每個grid__col__inner返回完整結果(包含所有電影的所有通道)。在下面你看到for循環的一次運行的結果。當我運行它時,它會多次返回相同的結果。

{ '通道':[u'VTM ' u'VITAYA', u'PRIME STAR ' u'PRIME ACTION', u'PRIME FAMILY ' u'PRIME FEZZTIVAL' , u'NPO3 '], 'start_ts':[u'22:30', u'13:35' , u'20:35' , u'06:30' , u'08: 00', u'09:40', u'11:00'], 'title':[u'Another 48 Hrs', u'Double Bill', u'Man zkt Vrouw', u'82達恩都在4月, u'Rio 2' , u'Epizodaüzivotu beraca zeljeza', u'300:帝國的崛起「]}

我做得不對for循環在這裏?

回答

1

閱讀從scrapy本文檔: http://doc.scrapy.org/en/latest/topics/selectors.html#working-with-relative-xpaths

當你正在做的:

chnl = col_inner.xpath('//div[@class="tv-guide__channel"]/h6/a/text()').extract() 

你提取所有的// DIV [@類= 「TV-guide__channel」]元素在文檔中,因爲//正在搜索所有文檔。而是試試這個:

chnl = col_inner.xpath('.//div[@class="tv-guide__channel"]/h6/a/text()').extract() 

.//將執行相對於當前節點的搜索。 你必須做同樣的與選擇的其餘部分:

def parse(self, response): 
    for col_inner in response.xpath('//div[@class="grid__col__inner"]'): 
     chnl = col_inner.xpath('.//div[@class="tv-guide__channel"]/h6/a/text()').extract() 
     for program in col_inner.xpath('.//div[@class="program"]'): 
      item = TVGuideItem() 
      item['channel'] = chnl 
      item['start_ts'] = program.xpath('.//div[@class="time"]/text()').extract() 
      item['title'] = program.xpath('.//div[@class="title"]/a/text()').extract() 
      yield item 

閱讀從scrapy本文檔: http://doc.scrapy.org/en/latest/topics/selectors.html#working-with-relative-xpaths