Python爬虫:如何完整抓取HTML DIV表格数据及Yahoo财经年/季数据
解决方案
问题1:抓取EPS数值(div直接存储/span嵌套的情况)
原代码全量抓取div和span标签的逻辑有误(soup_is.find_all('div') and soup_is.find_all('span')实际仅返回span标签列表),且容易遗漏数据。正确做法是精准定位财务数据单元格,用get_text()方法统一提取文本——不管数值直接在div内还是嵌套在span里,该方法都会自动提取所有子节点的文本内容。
问题2:分别抓取Annually和Quarterly数据
Yahoo财经的年度/季度财务数据切换对应URL参数变化:
- 年度数据URL:
https://finance.yahoo.com/quote/MSFT/financials?p=MSFT - 季度数据URL:
https://finance.yahoo.com/quote/MSFT/financials?p=MSFT&frequency=quarterly
只需构造两个URL,分别请求解析即可。
修改后的完整代码
import pandas as pd from bs4 import BeautifulSoup import requests def fetch_financial_data(url, headers): # 请求页面 response = requests.get(url, headers=headers, timeout=5) soup = BeautifulSoup(response.content, 'lxml') # 定位所有财务数据行(data-test="fin-row" 标记行) rows = soup.find_all('div', {'data-test': 'fin-row'}) financial_data = [] for row in rows: # 提取当前行的所有列数据(data-test="fin-col" 标记单元格) cols = row.find_all('div', {'data-test': 'fin-col'}) # 用get_text提取文本,自动处理div直接存值或span嵌套的情况 row_data = [col.get_text(strip=True) for col in cols] financial_data.append(row_data) # 转换为规范的DataFrame df = pd.DataFrame(financial_data) df.columns = df.iloc[0] df = df[1:].reset_index(drop=True) return df if __name__ == '__main__': index = 'MSFT' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' } # 构造年度、季度数据URL annual_url = f'https://finance.yahoo.com/quote/{index}/financials?p={index}' quarterly_url = f'https://finance.yahoo.com/quote/{index}/financials?p={index}&frequency=quarterly' # 获取并打印数据 print("=== 年度财务数据 ===") print(fetch_financial_data(annual_url, headers)) print("\n=== 季度财务数据 ===") print(fetch_financial_data(quarterly_url, headers))
关键修改说明
- 精准定位元素:通过
data-test属性(fin-row对应数据行,fin-col对应单元格)筛选财务数据,避免抓取无关内容。 - 统一文本提取:用
col.get_text(strip=True)替代l.string,既能提取div直接存储的EPS数值,也能提取span嵌套的其他数值,同时自动去除多余空格。 - 封装复用逻辑:将抓取流程封装为函数,传入不同URL即可获取年度/季度数据,代码更简洁易维护。
- 规范表格结构:将第一行设为表头,重置索引后输出的表格更符合财务数据的展示逻辑。
内容的提问来源于stack exchange,提问作者Dominik Kostienko
相关产品推荐
相关产品推荐

