Python Selenium点击季度按钮后仍获年度数据,如何遍历季度数据?
解决雅虎财经季度资产负债表爬取问题
你遇到的核心问题是点击"Quarterly"按钮后,页面还没完成数据更新就抓取了源码,导致拿到的还是初始的年度数据。另外直接遍历所有<div>元素过于宽泛,会混入大量无关内容,应该精准定位到财务表格的结构。
修正步骤:
- 等待页面数据更新:点击按钮后,必须等待季度数据的标识出现(比如季度日期表头),确保页面已完成渲染。
- 精准定位表格元素:雅虎财经的财务数据在
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
相关产品推荐
相关产品推荐

