2017-03-09 81 views
0

我想湊在此鏈接給定網頁單列相對多行數據 - http://new-york.eat24hours.com/picasso-pizza/19053如何提取scrapy

在這裏,我試圖讓所有喜歡的地址和電話等可能的細節因此,我已經提取了名稱,電話,地址,評論,評分。 但我也想在這裏提取餐廳的完整菜單(價格與物品的名稱)。 所以,我不知道如何管理這些數據到csv的輸出中。

單個網址的其餘數據將是單一的,但菜單中的項目總是數量不同。

這裏下面是我的代碼,因此遠

import scrapy 
from urls import start_urls 

class eat24Spider(scrapy.Spider): 
    AUTOTHROTTLE_ENABLED = True 
    name = 'eat24' 

    def start_requests(self): 
     for x in start_urls: 
      yield scrapy.Request(x, self.parse) 

    def parse(self, response): 

     brickset = response 
     NAME_SELECTOR = 'normalize-space(.//h1[@id="restaurant_name"]/a/text())' 
     ADDRESS_SELECTION = 'normalize-space(.//span[@itemprop="streetAddress"]/text())' 
     LOCALITY = 'normalize-space(.//span[@itemprop="addressLocality"]/text())' 
     REGION = 'normalize-space(.//span[@itemprop="addressRegion"]/text())' 
     ZIP = 'normalize-space(.//span[@itemprop="postalCode"]/text())' 
     PHONE_SELECTOR = 'normalize-space(.//span[@itemprop="telephone"]/text())' 
     RATING = './/meta[@itemprop="ratingValue"]/@content' 
     NO_OF_REVIEWS = './/meta[@itemprop="reviewCount"]/@content' 
     OPENING_HOURS = './/div[@class="hours_info"]//nobr/text()' 
     EMAIL_SELECTOR = './/div[@class="company-info__block"]/div[@class="business-buttons"]/a[span]/@href[substring-after(.,"mailto:")]' 

     yield { 
      'name': brickset.xpath(NAME_SELECTOR).extract_first().encode('utf8'), 
      'pagelink': response.url, 
      'address' : str(brickset.xpath(ADDRESS_SELECTION).extract_first().encode('utf8')+', '+brickset.xpath(LOCALITY).extract_first().encode('utf8')+', '+brickset.xpath(REGION).extract_first().encode('utf8')+', '+brickset.xpath(ZIP).extract_first().encode('utf8')), 
      'phone' : str(brickset.xpath(PHONE_SELECTOR).extract_first()), 
      'reviews' : str(brickset.xpath(NO_OF_REVIEWS).extract_first()), 
      'rating' : str(brickset.xpath(RATING).extract_first()), 
      'opening_hours' : str(brickset.xpath(OPENING_HOURS).extract_first()) 
     } 

我很抱歉,如果我提出這個混亂,但任何形式的幫助將不勝感激。 提前謝謝!

回答

0

如果你想提取完整的餐廳菜單,首先,你需要找到元素誰同時包含名稱和價格:

menu_items = response.xpath('//tr[@itemscope]') 

之後,你可以簡單地進行循環和迭代餐廳項目附加名稱和價格清單:

menu = [] 
for item in menu_items: 
    menu.append({ 
     'name': item.xpath('.//a[@class="cpa"]/text()').extract_first(), 
     'price': item.xpath('.//span[@itemprop="price"]/text()').extract_first() 
     }) 

最後,你可以添加新的「菜單」鍵,你的字典:

yield {'menu': menu} 

另外,我建議你使用scrapy項目用於存儲數據刮掉: https://doc.scrapy.org/en/latest/topics/items.html

對於控制檯輸出的csv文件使用scrapy飼料出口數據類型:

scrapy crawl yourspidername -o restaurants.csv 
+0

謝謝你這麼much..i會嘗試並讓你知道它是否工作或不。 –

+0

爲了簡單起見,我在menu_items中編輯了xpath。 – vold

+0

謝謝,真的幫助.. –