使用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
相关产品推荐
相关产品推荐

