You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

关键修改说明

  1. 精准定位元素:通过data-test属性(fin-row对应数据行,fin-col对应单元格)筛选财务数据,避免抓取无关内容。
  2. 统一文本提取:用col.get_text(strip=True)替代l.string,既能提取div直接存储的EPS数值,也能提取span嵌套的其他数值,同时自动去除多余空格。
  3. 封装复用逻辑:将抓取流程封装为函数,传入不同URL即可获取年度/季度数据,代码更简洁易维护。
  4. 规范表格结构:将第一行设为表头,重置索引后输出的表格更符合财务数据的展示逻辑。

内容的提问来源于stack exchange,提问作者Dominik Kostienko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:45:33