You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:15:01