Python使用Selenium遍历动态表格仅获取第一行问题求助
问题根因分析
- 定位路径写死了行索引:所有元素定位XPath都指定了
tr[2],代表只选取表格tbody下的第二行(第一行是表头),find_elements自然只能返回1个元素,循环只会执行1次,只能拿到第一行数据。 - 字段索引重复错误:
states_with_branches和employees两个字段都取了td[7],会导致两个字段值完全相同,后续customer_accounts的索引也会错位。 - 缺少页面加载等待:点击「Show all」按钮后,动态表格需要加载时间,没有加等待逻辑直接抓取数据,大概率会出现数据不全甚至找不到元素的报错。
- 多余导入:开头导入的
numpy.fabs全程没有使用,可以删除。
修复后的可运行代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd # 初始化浏览器 driver = webdriver.Chrome(r"C:\Users\noree\OneDrive\Documents\chromedriver.exe") driver.get('https://www.depositaccounts.com/banks/assets.aspx?instType=&stateType=hq&state=') driver.maximize_window() # 等待并点击Show all按钮 show_all_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="results"]/div/a')) ) show_all_button.click() # 等待表格全部加载完成,获取所有数据行(排除表头行) rows = WebDriverWait(driver, 15).until( EC.presence_of_all_elements_located((By.XPATH, '//*[@id="assetsTable"]/tbody/tr')) )[1:] # 索引0是表头,直接跳过 bank_results = [] for row in rows: temporary_data={ 'Rank': row.find_element(By.XPATH, './td[1]').text, 'Financial Institution': row.find_element(By.XPATH, './td[2]/a').text, 'Headquarters': row.find_element(By.XPATH, './td[3]').text, 'Assets': row.find_element(By.XPATH, './td[4]').text, 'Asset Growth': row.find_element(By.XPATH, './td[5]').text, 'Branches': row.find_element(By.XPATH, './td[6]').text, 'States with Branches': row.find_element(By.XPATH, './td[7]').text, 'Employees': row.find_element(By.XPATH, './td[8]').text, 'Customer Accounts': row.find_element(By.XPATH, './td[9]').text } bank_results.append(temporary_data) # 生成DataFrame df_data = pd.DataFrame(bank_results) # 导出到Excel,保存路径可自行修改 df_data.to_excel('银行资产数据.xlsx', index=False) # 关闭浏览器 driver.quit()
主要修改说明
- 先获取所有表格行,跳过表头后逐行遍历字段,避免不同字段列表长度不一致的问题
- 新增了显式等待逻辑,确保按钮可点击、表格加载完成后再执行后续操作,避免动态加载导致的数据缺失
- 修正了字段的td索引错位问题,每个字段对应正确的列位置
- 新增了Excel导出逻辑,调用
to_excel方法直接将DataFrame保存为本地Excel文件,index=False用于去掉默认的行号索引
内容的提问来源于stack exchange,提问作者tsy1
相关产品推荐
相关产品推荐

