向空DataFrame追加多个子DataFrame失败,仅显示最后一个数据
问题分析
你遇到的核心问题是循环中未正确累积DataFrame:
- 你初始化了空的
appended_data,但每次循环都基于这个空表去append当前表格,再把结果赋值给appended——这导致每次循环都是空表+当前单表,最终appended只保留最后一次循环的结果。 - 另外,
pandas.DataFrame.append已被标记为废弃(Deprecated),官方推荐用pd.concat实现数据拼接。
修复方案
方案1:修正累积逻辑(兼容旧版pandas)
把每次append后的结果重新赋值给累积变量,确保每次都是基于之前的数据继续追加:
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from datetime import date, datetime currentDay = datetime.now().day currentMonth = datetime.now().month currentYear = datetime.now().year date = f'{currentYear}-{currentMonth}-{currentDay}' url = f'https://www.racingandsports.com.au/form-guide/GenerateRaceGuide?discipline=thoroughbred&country=south-korea&course=busan&date={date}&meetingId=291056&cols=%5B%7B%22name%22%3A%22HTab%22%2C%22title%22%3A%22Tab%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22FormFigs5%22%2C%22title%22%3A%22Form%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.9375%22%7D%2C%7B%22name%22%3A%22HName%22%2C%22title%22%3A%22Horse%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HBP%22%2C%22title%22%3A%22BP%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22Jockey%22%2C%22title%22%3A%22Jockey%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22Trainer%22%2C%22title%22%3A%22Trainer%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HWeight%22%2C%22title%22%3A%22Wt%22%2C%22type%22%3A%22D%22%2C%22size%22%3A%220.75%22%7D%5D&addCols=%5B%22prizemoney%22%5D&fs=S&page=port&preview=true' chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver', options=chrome_options) driver.get(url) appended_data = pd.DataFrame() for i in range(1,10): data = driver.find_element(By.XPATH, f'//*[@id="parent"]/div[{i}]/div[2]/div/table').get_attribute('outerHTML') data_hdf = pd.read_html(data)[0] # 修复:将append结果重新赋值给累积变量,同时重置索引避免重复 appended_data = appended_data.append(data_hdf, ignore_index=True) appended_data
方案2:使用pd.concat(推荐,符合pandas最新规范)
创建列表存储所有表格的DataFrame,最后一次性拼接,效率更高:
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from datetime import date, datetime currentDay = datetime.now().day currentMonth = datetime.now().month currentYear = datetime.now().year date = f'{currentYear}-{currentMonth}-{currentDay}' url = f'https://www.racingandsports.com.au/form-guide/GenerateRaceGuide?discipline=thoroughbred&country=south-korea&course=busan&date={date}&meetingId=291056&cols=%5B%7B%22name%22%3A%22HTab%22%2C%22title%22%3A%22Tab%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22FormFigs5%22%2C%22title%22%3A%22Form%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.9375%22%7D%2C%7B%22name%22%3A%22HName%22%2C%22title%22%3A%22Horse%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HBP%22%2C%22title%22%3A%22BP%22%2C%22type%22%3A%22ND%22%2C%22size%22%3A%220.75%22%7D%2C%7B%22name%22%3A%22Jockey%22%2C%22title%22%3A%22Jockey%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22Trainer%22%2C%22title%22%3A%22Trainer%22%2C%22type%22%3A%22S%22%2C%22size%22%3A%222.25%22%7D%2C%7B%22name%22%3A%22HWeight%22%2C%22title%22%3A%22Wt%22%2C%22type%22%3A%22D%22%2C%22size%22%3A%220.75%22%7D%5D&addCols=%5B%22prizemoney%22%5D&fs=S&page=port&preview=true' chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver', options=chrome_options) driver.get(url) # 创建列表存储所有表格DataFrame df_list = [] for i in range(1,10): data = driver.find_element(By.XPATH, f'//*[@id="parent"]/div[{i}]/div[2]/div/table').get_attribute('outerHTML') data_hdf = pd.read_html(data)[0] df_list.append(data_hdf) # 一次性拼接所有DataFrame,重置索引避免重复 appended_data = pd.concat(df_list, ignore_index=True) appended_data
关键注意点
ignore_index=True:确保拼接后的DataFrame重置索引,避免索引重复问题pd.concat比循环append更高效,尤其是数据量较大时——append每次都会创建新的DataFrame,而concat仅需一次操作- 已修复XPATH中的
"为正常双引号",避免解析错误
内容的提问来源于stack exchange,提问作者Hasan Abdul Ghaffar
相关产品推荐
相关产品推荐

