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

Python Selenium点击季度按钮后仍获年度数据,如何遍历季度数据?

解决雅虎财经季度资产负债表爬取问题

你遇到的核心问题是点击"Quarterly"按钮后,页面还没完成数据更新就抓取了源码,导致拿到的还是初始的年度数据。另外直接遍历所有<div>元素过于宽泛,会混入大量无关内容,应该精准定位到财务表格的结构。

修正步骤:

  1. 等待页面数据更新:点击按钮后,必须等待季度数据的标识出现(比如季度日期表头),确保页面已完成渲染。
  2. 精准定位表格元素:雅虎财经的财务数据在table标签内,且有特定的类名,直接定位这个表格再提取数据更高效。

修正后的代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
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

def readQuarterlyBSData(ticker):
    url = f'https://finance.yahoo.com/quote/{ticker}/balance-sheet?p={ticker}'
    options = Options()
    options.add_argument('--headless')
    options.add_argument('--window-size=1920,1080')  # 无头模式下指定窗口大小,避免元素定位问题
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(url)
    
    # 点击Quarterly按钮
    quarterly_btn = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.XPATH, '//button[text()="Quarterly"]'))
    )
    quarterly_btn.click()
    
    # 等待季度数据加载完成:等待表格中出现季度日期格式的表头(比如"Jun 30, 2024")
    WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.XPATH, '//table//th[contains(text(), ",")]'))
    )
    
    # 抓取更新后的页面源码
    soup = BeautifulSoup(driver.page_source, 'lxml')
    driver.quit()  # 及时关闭浏览器
    
    # 定位到资产负债表的表格
    bs_table = soup.find('table', class_='W(100%) M(0)')
    if not bs_table:
        print("未找到资产负债表表格")
        return []
    
    quarterly_data = []
    # 遍历表格的每一行
    for row in bs_table.find_all('tr'):
        row_data = []
        # 遍历每行的单元格
        for cell in row.find_all(['th', 'td']):
            cell_text = cell.get_text(strip=True)
            if cell_text:
                row_data.append(cell_text)
        if row_data:
            quarterly_data.append(row_data)
    
    return quarterly_data

# 调用示例
data = readQuarterlyBSData('AAPL')
for row in data:
    print(row)

关键说明:

  • 用text()="Quarterly"定位按钮比固定ID更稳定,避免页面结构变更导致定位失效。
  • 无头模式下指定窗口大小,防止部分元素因布局问题无法定位。
  • 等待季度日期表头出现,确保数据已完成更新后再抓取源码。
  • 直接定位表格元素,提取行和单元格数据,避免无关内容干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:35:26