使用Selenium抓取默认隐藏的折叠元素内文本遇问题求助
问题分析与解决方案
你的核心问题是目标元素默认处于隐藏状态(aria-hidden='true' + display:none),且未触发"View Details"点击展开操作,导致Selenium无法获取到有效文本。以下是具体原因和解决方法:
问题根源
- 元素未展开:目标
<p>标签所在的容器默认隐藏,只有点击"View Details"后,容器的aria-hidden和style属性才会改变,元素变为可见。 - 等待条件错误:你使用的
presence_of_element_located仅检查元素是否存在于DOM中,但隐藏元素的.text属性在Selenium中会返回空字符串,即使DOM内有文本内容。 - 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
相关产品推荐
相关产品推荐

