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

使用BeautifulSoup4爬取雅虎财经股票价格返回[]的问题

问题排查与修复方案

我帮你梳理下代码里的几个关键问题,一步步解决:

1. 元素定位完全错误

你要找的目标span元素,class属性是Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib),而data-reactid是另一个独立属性,不是class。你写的soup.find_all("span", {"class": "data-reactid"})相当于在找class名为data-reactid的span,这显然不存在,所以返回空列表[]。

正确的定位方式应该是:

# 根据class定位(推荐,因为data-reactid可能动态变化)
price_element = soup.find("span", class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")
# 或者如果想用data-reactid属性定位(不推荐,属性值可能随时变)
# price_element = soup.find("span", attrs={"data-reactid": "35"})

2. 雅虎财经的反爬拦截

雅虎财经会检测请求的User-Agent,如果直接用requests.get(url)发送请求,没有模拟浏览器的请求头,返回的页面内容会和你在浏览器里看到的不一样——目标元素可能根本不存在,这也是你拿不到数据的重要原因。

你需要给请求添加headers,模拟浏览器访问:

def Calculation():
    stock = Ticker_entry.get()
    url = make_url(stock)
    # 添加请求头,模拟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"
    }
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.content, "lxml")
    # 正确定位元素
    price_element = soup.find("span", class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")
    if price_element:
        stock_price = price_element.get_text(strip=True)
        print(stock_price)
        # 把结果填入输入框
        Stock_price_output.delete(0, END)
        Stock_price_output.insert(0, stock_price)
    else:
        print("未找到股票价格元素")

3. 代码的其他小问题

  • 导入模块时格式错误:from tkinter import * from bs4 import BeautifulSoup应该拆分成两行,否则会报错:
    from tkinter import *
    from bs4 import BeautifulSoup
    import requests
    import lxml
    
  • 你当前的Calculation函数只打印了结果,没有把数据填入对应的Stock_price_output输入框,上面的修复代码已经加上了这部分逻辑。

额外提醒

雅虎财经的页面结构可能随时更新,如果你之后又出现找不到元素的情况,记得重新检查浏览器里的元素结构,更新定位的选择器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:24:43