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

使用BeautifulSoup的find_all抓取NYSE页面flex_tr类元素失败如何解决

爬取NYSE页面flex_tr元素失败的原因及解决方法

问题原因

  • 页面动态加载延迟:你在调用driver.get()后立刻获取页面源码,此时目标表格的flex_tr类元素还未完成异步渲染,DOM结构中不存在对应节点,BeautifulSoup自然无法解析到对应内容。
  • 页面交互阻塞:NYSE页面首次打开会弹出Cookie授权弹窗,未点击同意的情况下,后续的行情表格内容不会触发加载。
  • 缺少等待逻辑:没有设置等待条件判断目标元素是否已加载完成,直接读取源码会拿到未完成渲染的初始页面内容。

解决方法

修改代码增加弹窗处理逻辑和显式等待,确保拿到完整渲染的页面内容后再解析,修改后的可运行代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time

# 注意Windows路径要加r避免转义问题,或者用双反斜杠
driver = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
driver.get('https://www.nyse.com/quote/XNGS:AAPL')

# 处理Cookie弹窗,最多等5秒找同意按钮
try:
    cookie_accept = WebDriverWait(driver, 5).until(
        EC.element_to_be_clickable((By.XPATH, '//button[text()="Accept All Cookies"]'))
    )
    cookie_accept.click()
except:
    # 没找到弹窗就跳过,不影响后续逻辑
    pass

# 显式等待flex_tr元素加载完成,最多等待10秒
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, 'flex_tr'))
)

# 可选加1秒缓冲,避免部分内容渲染不完全
time.sleep(1)

content = driver.page_source
soup = BeautifulSoup(content, 'html.parser')
flex_tr = soup.find_all("div", class_="flex_tr")
print(f"共找到{len(flex_tr)}个符合条件的元素")
print(flex_tr)

driver.close()

你也可以直接用Selenium自带的定位方法直接获取元素,不需要经过BeautifulSoup解析:

flex_tr_list = driver.find_elements(By.CLASS_NAME, 'flex_tr')
for tr in flex_tr_list:
    print(tr.text)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:15:03