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

如何解决pandas使用for循环写入Excel仅保存最后一条数据的问题

问题解决方法

核心原因

你的DataFrame拼接、Excel导出逻辑全部写在遍历酒店URL的for url in urls:循环内部,每处理完一家酒店就会生成仅包含当前酒店数据的DataFrame,直接覆盖写入v.xlsx文件,因此最终文件里只会保留最后一家酒店的记录。

修改方案

你需要把多酒店数据的合并、导出逻辑移到URL遍历循环的外部,先收集所有酒店的DataFrame,最后统一拼接导出即可,具体修改步骤如下:

  1. 在遍历URL的循环外部定义一个全局列表,用来存储所有酒店的DataFrame
  2. 循环内部处理完单酒店的DataFrame后,将其追加到全局列表中,不做拼接、导出操作
  3. 所有URL遍历完成后,再将全局列表里的所有单酒店DataFrame拼接,设置好多级索引后统一导出Excel

修改后关键代码示例

你只需要调整for url in urls:循环前后的代码即可,调整后代码如下:

# 原有代码不变,遍历拿到所有酒店url之后
urls = []    
records = []
hotels = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//div[starts-with(@id,'produit_affair')]")))

for hotel in hotels:
    link = hotel.find_element_by_xpath(".//span[@class='tittre_hotel']/a").get_attribute("href")
    urls.append(link)

# 新增:定义全局列表存储所有酒店的DataFrame
all_hotel_dfs = []

for url in urls:
    # ----------------------
    # 原有爬取单酒店数据的逻辑全部保留不变
    # ----------------------
    # 原来的单酒店df处理部分修改如下:
    s="{} : {} - {}".format(name, opt, optiondata)
    ds = []
    for l in s.splitlines():
        d = l.split("-")
        if len(d) > 1:
            df = pd.DataFrame(ast.literal_eval(d[1].strip()))
            ds.append(df)
    for df in ds:
        df.reset_index(drop=True, inplace=True)
    single_hotel_df = pd.concat(ds, axis= 1)
    # 修改列的多级索引,加入酒店名、房型信息,避免后续合并列名冲突
    cols = single_hotel_df.columns
    cols = [((name, opt, col)) for col in cols]
    single_hotel_df.columns=pd.MultiIndex.from_tuples(cols)
    print(single_hotel_df.T)
    # 把当前酒店的df追加到全局列表,不直接导出
    all_hotel_dfs.append(single_hotel_df)

# 退出URL循环后,统一拼接所有酒店的df,导出Excel
final_df = pd.concat(all_hotel_dfs, axis=1)
final_df.to_excel("v.xlsx")

额外优化建议

  • 可以在拼接时调整轴参数axis=0或者axis=1匹配你需要的表格布局,你预期的效果是横向扩展多酒店数据,所以保持axis=1即可
  • 如果爬取数据量较大,怕中途中断丢失数据,可以每爬完固定数量酒店就临时导出一次备份

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:57:03