无法从ESPN网站提取表格并保存CSV:AttributeError问题求助
问题解决与网页抓取最佳实践
错误原因分析
- AttributeError 根源:
pd.read_html()返回的是DataFrame列表,不是单个DataFrame。你直接把列表赋值给df后调用to_csv(),自然会报错——列表没有这个方法。 - 表格提取不完整:你启动了Selenium浏览器,但没利用它获取动态渲染后的页面内容,反而用
requests.get()拉取静态HTML。ESPN的这个页面是动态加载的,静态HTML只包含部分数据,所以提取不全。
修正后的代码
下面是修复后的完整代码,利用Selenium获取完整动态页面,再提取表格并保存:
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By service = Service(r"C:\Users\Sai Ram\Documents\Python\Driver\chromedriver.exe") def get_driver(): options = webdriver.ChromeOptions() options.add_argument("disable-infobars") options.add_argument("start-maximized") options.add_argument("disable-dev-shm-usage") options.add_argument("no-sandbox") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_argument("disable-blink-features=AutomationControlled") driver = webdriver.Chrome(service=service, options=options) driver.get("https://stats.espncricinfo.com/ci/engine/records/team/match_results.html?class=3;id=2022;type=year") # 显式等待表格加载完成,替代固定sleep更稳定 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "table")) ) return driver def main(): driver = get_driver() # 获取浏览器渲染后的完整页面HTML html = driver.page_source # 提取页面中的所有表格 df_list = pd.read_html(html) # 查看表格数量,选择目标表格(第一个表格就是比赛结果) print(f"共提取到 {len(df_list)} 个表格") df = df_list[0] # 保存到CSV,关闭索引列避免冗余 df.to_csv(r'C:\Users\Sai Ram\Documents\Power BI\End to End T-20 World Cup DashBoard\CSV Data\scappying.csv', index=False) # 关闭浏览器释放资源 driver.quit() if __name__ == "__main__": main()
关键改动说明
- 用
driver.page_source获取动态渲染后的完整HTML,替代requests.get()的静态内容。 - 从
df_list中选取目标DataFrame(这里第一个表格就是需要的比赛结果,可根据实际情况调整索引)。 - 用
WebDriverWait显式等待表格加载,替代固定time.sleep(),提升稳定性和效率。 - 添加
index=False避免写入不必要的索引列,关闭浏览器释放资源。
Python网页抓取最佳方法
1. 优先调用官方API
如果目标网站提供公开API(比如ESPN部分数据有接口),直接调用是最优解:
- 数据格式规范(JSON/XML),解析成本极低。
- 规避反爬机制,稳定性远高于页面抓取。
- 无需处理页面渲染逻辑。
2. 静态内容:Requests + Pandas/BeautifulSoup
如果页面是纯静态(数据直接嵌入HTML,无动态加载):
- 用
requests获取HTML内容。 - 表格类数据直接用
pd.read_html()快速提取;非表格数据用BeautifulSoup解析标签。
3. 动态内容:Selenium/Playwright
如果页面依赖JavaScript动态加载(滚动加载、异步请求):
- Selenium:支持主流浏览器,文档丰富,适合大多数动态场景。
- Playwright:新一代自动化工具,API更简洁,支持多浏览器,内置等待机制,比Selenium更省心。
4. 反爬应对要点
- 配置真实请求头(User-Agent等),模拟浏览器行为。
- 控制请求频率,避免短时间内大量请求触发IP封禁。
- 动态页面优先用显式等待,减少不必要的等待时间。
内容的提问来源于stack exchange,提问作者Dinakar V.
相关产品推荐
相关产品推荐

