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

使用Selenium抓取默认隐藏的折叠元素内文本遇问题求助

问题分析与解决方案

你的核心问题是目标元素默认处于隐藏状态(aria-hidden='true' + display:none),且未触发"View Details"点击展开操作,导致Selenium无法获取到有效文本。以下是具体原因和解决方法:

问题根源

  1. 元素未展开:目标<p>标签所在的容器默认隐藏,只有点击"View Details"后,容器的aria-hidden和style属性才会改变,元素变为可见。
  2. 等待条件错误:你使用的presence_of_element_located仅检查元素是否存在于DOM中,但隐藏元素的.text属性在Selenium中会返回空字符串,即使DOM内有文本内容。
  3. XPath匹配范围过宽://tr[{i}]//p会匹配该行所有<p>标签,包括其他无关的隐藏元素,导致获取到空内容。

解决步骤

1. 先点击"View Details"展开容器

必须触发展开操作,让目标元素从隐藏变为可见。

2. 使用可见性等待条件

改用visibility_of_element_located等待元素可见,确保能获取到文本。

3. 精准定位目标元素

基于当前行使用相对XPath,避免匹配无关元素。

修改后的代码

import datetime
import pandas as pd
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

driver = webdriver.Chrome()
url = 'https://www.finder.com.au/savings-accounts/best-savings-accounts'
driver.get(url)

# 处理页面Cookie弹窗(如果存在)
try:
    accept_cookie = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "Accept")]'))
    )
    accept_cookie.click()
except:
    pass

# 等待表格行加载完成
savings_rows = WebDriverWait(driver, 30).until(
    EC.presence_of_all_elements_located((By.XPATH, '//*[@id="comparison-table-0000000000"]/tbody//tr'))
)

for row_idx in range(len(savings_rows)):
    # 重新定位当前行,避免元素引用失效
    current_row = WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.XPATH, f'//*[@id="comparison-table-0000000000"]/tbody/tr[{row_idx+1}]'))
    )
    
    # 点击当前行的"View Details"按钮
    view_btn = WebDriverWait(current_row, 10).until(
        EC.element_to_be_clickable((By.XPATH, './/button[contains(text(), "View Details")]'))
    )
    view_btn.click()
    
    # 等待目标<p>元素可见后获取文本
    target_text = WebDriverWait(current_row, 10).until(
        EC.visibility_of_element_located((By.XPATH, './/td[10]//dl/dd/p[1]'))
    ).text
    
    print(f"第{row_idx+1}行详情: {target_text}")

driver.quit()

关键说明

  • 相对XPath:使用.开头的相对路径(如.//button),确保仅在当前行内定位元素,避免跨行匹配。
  • 可见性等待:visibility_of_element_located会等待元素同时满足"存在于DOM"和"可见"两个条件,此时获取.text才能得到有效内容。
  • 避免元素失效:循环中重新定位当前行,防止页面交互后原有元素引用过期(StaleElementReferenceException)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:55:17