Scrapy多URL爬取酒店评论:如何实现单评论单行CSV存储?
解决Scrapy爬取Booking评论时每条评论单独占行的问题
问题根源
你当前的代码中,reviews和countries通过extract()获取的是列表类型数据,直接赋值给Item字段后,整个列表会被存入CSV的单个单元格;同时你只在遍历all_items时yield一次Item,导致每个酒店的所有评论只占一行。
修改方案
需要遍历每条评论与对应的国家,为每一对数据创建独立的Item并yield,确保每条评论单独占一行:
def parse(self, response): # 定位到每个评论项的独立容器(替换原范围过大的xpath) review_items = response.xpath("//div[contains(@class, 'review_item')]") for item in review_items: # 为每条评论创建新的Item实例 baku_item = BakuRevItem() # 提取单条评论文本(用get()替代extract()获取单个值) review_text = item.xpath(".//div[@class='db29ecfbe2 c688f151a2']/text()").get(default='') # 提取对应评论者的国家 country = item.xpath(".//span[@class='a5499473ab f01b03907b']/text()").get(default='') baku_item['reviews'] = review_text.strip() if review_text else '' baku_item['countries'] = country.strip() if country else '' yield baku_item
关键改动说明
- 精准定位评论单元:原代码xpath范围过大,改为直接定位每个评论的独立容器(如
review_item类的div,可根据页面实际结构微调),确保遍历的是单条评论。 - 单条数据提取:用
get()替代extract(),获取单个字符串而非列表,避免批量数据存入同一单元格。 - 循环内生成Item:每次循环创建新的
BakuRevItem实例,保证每条评论对应独立的Item对象,yield后CSV会自动生成一行。 - 数据清洗:用
default=''处理空值,strip()去除多余空格,保证数据整洁。
内容的提问来源于stack exchange,提问作者S_Naghiyeva
相关产品推荐
相关产品推荐

