如何解决pandas使用for循环写入Excel仅保存最后一条数据的问题
问题解决方法
核心原因
你的DataFrame拼接、Excel导出逻辑全部写在遍历酒店URL的for url in urls:循环内部,每处理完一家酒店就会生成仅包含当前酒店数据的DataFrame,直接覆盖写入v.xlsx文件,因此最终文件里只会保留最后一家酒店的记录。
修改方案
你需要把多酒店数据的合并、导出逻辑移到URL遍历循环的外部,先收集所有酒店的DataFrame,最后统一拼接导出即可,具体修改步骤如下:
- 在遍历URL的循环外部定义一个全局列表,用来存储所有酒店的DataFrame
- 循环内部处理完单酒店的DataFrame后,将其追加到全局列表中,不做拼接、导出操作
- 所有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
相关产品推荐
相关产品推荐

