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

Python爬取Yahoo Finance股票:多数正常但ISPA.DE触发AttributeError

解决Yahoo Finance爬取ISPA.DE时的AttributeError问题

问题原因

你的代码报错是因为soup.find()返回了None,说明页面中找不到指定class的fin-streamer元素。主要有两个核心原因:

  • 页面结构差异:不同市场的股票页面(比如德国上市的.DE后缀股票),Yahoo Finance的DOM结构或元素class规则和美股存在差异,原有定位方式失效。
  • 反爬拦截:直接用requests.get()发起请求会被识别为非浏览器请求,返回的页面没有实际数据,自然找不到目标元素。

解决方案

1. 添加浏览器请求头,绕过基础反爬

Yahoo Finance会校验请求的User-Agent标识,模拟浏览器请求可避免被拦截。

2. 改用更通用的元素定位方式

放弃依赖易变的class名称,改用Yahoo Finance统一的data-test属性定位价格元素,这个属性在不同市场的页面中稳定性更高。

3. 增加异常判断,避免程序崩溃

在获取元素文本前先判断元素是否存在,防止直接调用.text触发NoneType报错。

修改后的代码

import requests
from bs4 import BeautifulSoup

def stockprice(stock_ticker):
    url = f"https://finance.yahoo.com/quote/{stock_ticker}?p={stock_ticker}&.tsrc=fin-srch"
    print(url)
    
    # 模拟Chrome浏览器请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
        'Accept-Language': 'en-US,en;q=0.9'
    }
    
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'html.parser')

    # 用全局统一的data-test属性定位价格元素
    price_element = soup.find('fin-streamer', {'data-test': 'qsp-price'})
    
    if price_element:
        price = price_element.text
        print(price)
    else:
        print("无法找到价格元素,可能页面结构变化或被反爬拦截")

stockprice("ISPA.DE")

额外排查步骤

如果仍然无法获取数据,先打印返回页面的前500字符,确认是否拿到了真实的股票页面:

print(r.text[:500])

如果返回内容包含"Verify you are human"等验证提示,说明需要更复杂的反爬处理(如Session维持、验证码识别),但大部分情况下添加请求头即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:02