Selenium点击div折叠WSJ财报表格并转Pandas DataFrame问题咨询
问题解答
问题1:如何实现点击div元素折叠目标表格后转换为Pandas DataFrame
你原有代码存在3个核心问题导致点击失败:
- 未处理WSJ页面默认弹出的cookie同意弹窗,弹窗会在页面最上层遮挡所有可点击元素,导致定位到的元素无法触发点击动作
- 定位元素的XPATH错误:你使用的
cr_cashflow是现金流量表模块的类名,当前访问的资产负债表页面对应模块类名为cr_balance-sheet,类名不匹配自然定位不到目标元素 - 语法错误:
print(driver.page_source[0][-1])中page_source是字符串类型,两层索引会直接抛出异常,中断后续代码执行
以下是修正后可正常运行的代码:
import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver import pandas as pd # Selenium 4.6+ 无需手动指定chromedriver路径,会自动匹配安装 driver = webdriver.Chrome() wait = WebDriverWait(driver, 20) url = 'https://www.wsj.com/market-data/quotes/TSLA/financials/annual/balance-sheet' driver.get(url) # 第一步:先处理cookie同意弹窗 try: accept_cookie = wait.until(EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler"))) accept_cookie.click() time.sleep(2) except: # 没有弹窗就跳过 pass # 第二步:定位负债及权益表格的折叠按钮,用属性匹配保证定位准确性 target_element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(text(),'Liabilities & Shareholders Equity')]/ancestor::div[@class='cr_dataTable module']/div[1]"))) # 用JS点击,规避元素遮挡导致的点击失效问题 driver.execute_script("arguments[0].click();", target_element) time.sleep(3) # 读取所有表格,索引0为资产表,索引1为负债及权益表 tables = pd.read_html(driver.page_source) # 按需取对应索引的表格即可,无需额外折叠/展开也能正常读取 df = tables[1] df.to_excel('./tesla_balancesheet_3.xlsx', sheet_name='balance_sheet', index=True) print(df.tail()) driver.quit()
补充说明:实际上不需要折叠表格也可以读取到所有内容,pd.read_html会读取页面DOM中所有的<table>标签,不管标签是否设置了隐藏属性,只要DOM中存在就可以被识别,你直接取对应索引的表格即可,无需额外做折叠/展开操作。
问题2:为什么手动折叠表格后driver.page_source无法读取到对应内容
有两个常见原因:
- 你手动操作的不是Selenium启动的Chrome实例:Selenium启动的是独立的干净浏览器进程,和你本地日常使用的Chrome窗口完全隔离,你在自己打开的Chrome里操作不会同步到Selenium控制的浏览器,自然
page_source不会有变化 - 折叠操作触发了DOM移除:WSJ前端基于React开发,部分折叠动作会直接把隐藏的表格元素从DOM树中移除,而不是仅设置
display:none隐藏,这种情况下page_source里自然没有对应的表格标签,也就无法被pd.read_html识别。
内容的提问来源于stack exchange,提问作者rd9911
相关产品推荐
相关产品推荐

