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

解决Python中单个对象存在多个DataFrame的问题

问题排查与解决:循环爬取评论合并DataFrame报错

问题描述

循环爬取2页Trustpilot客户评论,目标是合并为单个DataFrame,但执行时触发报错:typeerror: cannot concatenate object of type '<class 'str'>'; only series and dataframe objs are valid,且当前代码无法积累多页数据。

错误根源

  1. 变量覆盖导致数据丢失:原代码在循环中每次重新赋值df,最终仅保留最后一页的DataFrame,没有积累多页数据的容器。
  2. source列赋值隐患:source = url是单个字符串,虽然pandas会自动广播为同长度列,但如果合并操作时误将字符串与DataFrame混合,会触发类型错误。
  3. 合并逻辑缺失:没有收集每页DataFrame的步骤,直接尝试合并单个变量必然出错。

修正后的代码

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd
import json

# 初始化列表存储每页的DataFrame
df_list = []
page = 1
urls = []
while page != 3:
    url = f"https://www.trustpilot.com/review/trupanion.com?page={page}"
    urls.append(url)
    page += 1

for url in urls:
    response = requests.get(url)
    html = response.content
    soup = bs(html, "html.parser")
    results = soup.find(id="__NEXT_DATA__")
    json_object = json.loads(results.contents[0])
    reviews = json_object["props"]["pageProps"]["reviews"]
    
    # 直接构造数据字典,避免单独创建Series
    data = {
        'id': [sub['id'] for sub in reviews],
        'filtered': [sub['filtered'] for sub in reviews],
        'pending': [sub['pending'] for sub in reviews],
        'rating': [sub['rating'] for sub in reviews],
        'title': [sub['title'] for sub in reviews],
        'likes': [sub['likes'] for sub in reviews],
        'experienced': [sub['dates']['experiencedDate'] for sub in reviews],
        'published': [sub['dates']['publishedDate'] for sub in reviews],
        'source': [url] * len(reviews)  # 生成同长度的source列表
    }
    
    # 生成单页DataFrame并加入列表
    single_page_df = pd.DataFrame(data)
    df_list.append(single_page_df)
    print(single_page_df)

# 合并所有页的DataFrame
final_df = pd.concat(df_list, ignore_index=True)
print("合并后的最终DataFrame:")
print(final_df)

关键修正说明

  • 新增数据积累容器:用df_list列表收集每一页生成的DataFrame,避免变量覆盖。
  • 规范source列格式:用[url] * len(reviews)生成与其他列同长度的列表,消除类型隐患。
  • 简化数据构造逻辑:直接通过列表生成DataFrame,无需单独创建Series,代码更简洁高效。
  • 正确执行合并:使用pd.concat()合并列表中所有DataFrame,ignore_index=True重置索引,避免重复索引问题。

内容的提问来源于stack exchange,提问作者David Reynolds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:30:22