Python 2.7 如何相对于scrapy中的单行提取多行数据
我正试图刮在这个链接中给出的网页- 在这里,我试图得到所有可能的细节,如地址和电话等。。 到目前为止,我已经提取了姓名、电话、地址、评论和评级。 但我还想在此提取餐厅的完整菜单(项目名称和价格)。 到目前为止,我不知道如何将这些数据管理到csv的输出中 单个url的其余数据将是单个的,但菜单中的项目始终具有不同的数量 下面是到目前为止我的代码-Python 2.7 如何相对于scrapy中的单行提取多行数据,python-2.7,scrapy,Python 2.7,Scrapy,我正试图刮在这个链接中给出的网页- 在这里,我试图得到所有可能的细节,如地址和电话等。。 到目前为止,我已经提取了姓名、电话、地址、评论和评级。 但我还想在此提取餐厅的完整菜单(项目名称和价格)。 到目前为止,我不知道如何将这些数据管理到csv的输出中 单个url的其余数据将是单个的,但菜单中的项目始终具有不同的数量 下面是到目前为止我的代码- import scrapy from urls import start_urls class eat24Spider(scrapy.Spider)
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())
}
我很抱歉,如果我使这个困惑,但任何形式的帮助将不胜感激。
提前谢谢你 如果要提取完整的餐厅菜单,首先需要找到同时包含名称和价格的元素:
menu_items = response.xpath('//tr[@itemscope]')
之后,您可以简单地进行for循环,并在列表中添加名称和价格的餐厅项目上进行迭代:
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()
})
最后,您可以在dict中添加新的“菜单”键:
yield {'menu': menu}
此外,我建议您使用碎片项目来存储碎片数据:
要在csv文件中输出数据,请使用scrapy提要导出,请在控制台中键入:
scrapy crawl yourspidername -o restaurants.csv