如何使用Python的BeautifulSoup库提取雅虎财经页面的表格数据
实现方案
前置依赖
先安装需要用到的第三方库:
pip install requests beautifulsoup4 pandas
核心逻辑说明
雅虎财经有基础反爬机制,请求时必须携带User-Agent请求头模拟浏览器访问,否则会返回403拒绝访问。页面内的历史行情表格的class属性为W(100%) M(0),直接定位该标签后逐行提取内容即可。
完整可运行代码
import requests from bs4 import BeautifulSoup import pandas as pd # 请求头,模拟Chrome浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } url = "https://finance.yahoo.com/quote/GC%3DF/history?p=GC%3DF" # 发送请求获取页面内容 response = requests.get(url, headers=headers) response.raise_for_status() # 请求失败直接抛出异常 # 解析页面 soup = BeautifulSoup(response.text, "html.parser") # 定位历史行情表格 table = soup.find("table", class_="W(100%) M(0)") if not table: print("未找到目标表格,页面结构可能已更新") else: # 提取表头 headers_list = [th.get_text(strip=True) for th in table.thead.find_all("th")] # 提取表格行数据 rows_data = [] for tr in table.tbody.find_all("tr"): row = [td.get_text(strip=True) for td in tr.find_all("td")] # 过滤长度不匹配的注释行(如分红、拆股提示行) if len(row) == len(headers_list): rows_data.append(row) # 转成DataFrame方便后续处理 df = pd.DataFrame(rows_data, columns=headers_list) # 打印前10行验证 print(df.head(10)) # 可选:保存为csv文件 # df.to_csv("gold_history.csv", index=False, encoding="utf-8-sig")
注意事项
- 如果运行时找不到表格,可手动打开页面检查表格的class属性是否有更新,替换代码中对应参数即可
- 请勿高频批量请求,避免IP被雅虎财经限制访问
- 表格内的特殊行(如股息、拆股公告行)结构和普通行情行不同,代码中已经做了基础过滤,你可以根据自身需求调整过滤规则
内容的提问来源于stack exchange,提问作者Mohammad Sahraeian
相关产品推荐
相关产品推荐

