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

使用BeautifulSoup无法定位纳斯达克财报日历表格中指定class的div元素

使用BeautifulSoup无法定位纳斯达克财报日历表格中指定class的div元素

我之前也碰到过类似的问题,咱们先拆解下核心原因和解决办法:

首先,最关键的问题:页面内容是动态加载的

你直接用requests.get()拿到的只是页面的初始静态HTML,而纳斯达克的财报日历表格是通过JavaScript动态渲染出来的——也就是说,那些带table-cell fixed-column-size-50px text-align-left类的div元素,根本不存在于你最初请求到的源码里,所以不管怎么写class选择器,BeautifulSoup都找不到它们。

怎么验证这一点?

你可以先打印下requests.get(URL).text,搜索有没有"AAPL"或者你要找的股票代码,肯定搜不到。这就说明必须先拿到动态渲染后的页面源码。

解决办法有两种,按需选择:

方法一:用Selenium模拟浏览器加载页面

这种方法最直观,相当于让浏览器帮你把页面渲染好,再拿源码解析:

  1. 先安装依赖:
pip install selenium
  1. 下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),然后写代码:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

URL = "https://www.nasdaq.com/market-activity/earnings"

# 初始化Chrome浏览器(确保驱动路径正确,或者配置到环境变量里)
driver = webdriver.Chrome()
driver.get(URL)

# 等待目标元素加载出来,最多等10秒
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "div.table-cell.fixed-column-size-50px.text-align-left"))
    )
except Exception as e:
    print(f"页面加载超时:{e}")
    driver.quit()
    exit()

# 拿到渲染后的页面源码
page_source = driver.page_source
driver.quit()

# 现在用BeautifulSoup解析就没问题了
soup = BeautifulSoup(page_source, "html.parser")

# 正确匹配多class的两种方式:
# 方式1:用CSS选择器(推荐,更简洁)
table_cells = soup.select("div.table-cell.fixed-column-size-50px.text-align-left")
# 方式2:用class_参数传入列表
# table_cells = soup.find_all("div", class_=["table-cell", "fixed-column-size-50px", "text-align-left"])

# 提取股票代码
for cell in table_cells:
    symbol = cell.find("a").text.strip()
    print(symbol)

方法二:直接请求后台API(更高效)

模拟浏览器毕竟有点笨重,你可以用浏览器的开发者工具(F12打开,切换到Network标签),刷新页面后找XHR类型的请求,会发现纳斯达克其实是通过API接口拉取财报数据的。直接请求它就能拿到JSON格式的数据,不需要解析HTML:

import requests

# 加个User-Agent模拟浏览器,避免被拦截
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"
}

api_url = "https://api.nasdaq.com/api/calendar/earnings"
response = requests.get(api_url, headers=headers)
response.raise_for_status()  # 检查请求是否成功

data = response.json()
# 从返回的JSON里提取股票代码,具体结构可以打印data看看
earnings_rows = data.get("data", {}).get("calendar", {}).get("rows", [])
for row in earnings_rows:
    print(row.get("symbol"))

补充:关于多class的正确匹配方式

如果是静态页面里的元素,你之前的写法有问题——BeautifulSoup匹配多class时,要么用空格分隔的字符串(注意不要带换行),要么用列表形式,或者CSS选择器:

  • 正确写法1:soup.find_all("div", class_="table-cell fixed-column-size-50px text-align-left")
  • 正确写法2:soup.find_all("div", class_=["table-cell", "fixed-column-size-50px", "text-align-left"])
  • 正确写法3:soup.select("div.table-cell.fixed-column-size-50px.text-align-left")

但回到你的问题,核心还是动态加载的问题,先解决这个,class匹配就不是事儿了。

备注:内容来源于stack exchange,提问作者solac34

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:24:51