无法提取Yahoo Finance财报日期问题求助(附Python代码)
问题解决:Yahoo Finance财报日期提取失败
问题背景
现有基于Selenium、Pandas和Re的Python代码可提取Yahoo Finance页面的公司名称,但无法提取财报日期。目标页面示例:https://finance.yahoo.com/quote/A?p=A&.tsrc=fin-srch,需提取内容如Agilent Technologies, Inc. (A)和Earnings Date Aug 14, 2023 - Aug 18, 2023。
问题原因
- Selenium方法过时:原代码使用已弃用的
find_element_by_xpath方法,新版本Selenium中无法正常工作 - 未处理动态加载:Yahoo Finance页面为动态渲染,直接查找元素可能因未加载完成导致失败
- XPath定位不准确:原XPath的文本匹配逻辑未适配页面实际结构
修复后的代码
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 import pandas as pd # 读取包含链接的Excel文件 df = pd.read_excel('file.xlsx') # 存储提取数据的空列表 company_names = [] earnings_dates = [] # 初始化Selenium驱动 driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) # 设置10秒显式等待超时 # 遍历DataFrame中的链接 for index, row in df.iterrows(): url = row['Link'] driver.get(url) # 提取公司名称(改用Selenium定位,比正则更稳定) try: company_name_element = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, 'h1.D\\(ib\\).Fz\\(18px\\)')) ) company_name = company_name_element.text.strip() except: company_name = 'Company name not found' # 提取财报日期 try: # 先定位到包含"Earnings Date"的行,再取对应的数值单元格 earnings_row = wait.until( EC.presence_of_element_located((By.XPATH, '//tr[td[text()="Earnings Date"]]')) ) earnings_date = earnings_row.find_element(By.XPATH, './td[2]').text.strip() # 拼接成目标格式 earnings_date = f'Earnings Date {earnings_date}' except: earnings_date = 'Earnings date not found' # 添加到列表 company_names.append(company_name) earnings_dates.append(earnings_date) # 关闭驱动 driver.quit() # 生成结果DataFrame df_extracted = pd.DataFrame({ 'Link': df['Link'], 'Company Name': company_names, 'Earnings Date': earnings_dates }) # 打印结果 print(df_extracted)
关键修复点
- 替换过时方法:使用
find_element(By.XPATH, ...)替代已弃用的find_element_by_xpath - 添加显式等待:通过
WebDriverWait等待元素加载完成,避免动态渲染导致的元素未找到问题 - 优化元素定位:先定位包含目标文本的整行,再提取对应数值单元格,提升定位准确性
- 优化公司名提取:改用CSS选择器定位标题元素,比正则表达式更稳定可靠
内容的提问来源于stack exchange,提问作者JAVED SHAIKH
相关产品推荐
相关产品推荐

