使用Selenium WebDriver提取文本数据时仅获单个元素问题求助
问题分析与修复方案
核心问题点
- 循环逻辑混乱:循环中同时修改
number_of_pages_to_enter并使用range(number_of_pages_to_enter),导致循环次数与目标链接索引不匹配;构造XPath时误用递减的number_of_pages_to_enter而非循环变量,每次点击的是倒数第N个链接,而非顺序遍历所有链接。 - 文本拼接错误:
cimek=cim+cim会将同一个标题重复拼接,而非累加不同子页面的标题。 - 页面返回后的元素定位缺失等待:从子页面返回后,原页面DOM可能重新渲染,未等待元素加载就直接定位,容易导致定位失败。
- 链接数量统计方式不可靠:通过
outerHTML.count("<tr")统计行数容易出错,建议直接通过元素定位获取所有目标行。
修正后的代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 统计目标链接数量:直接获取所有包含链接的tr(跳过表头等无关行) rows = WebDriverWait(browser, 10).until( EC.presence_of_all_elements_located((By.XPATH, '//*[@id="wrapper"]/main/section/div/div[2]/table/tbody/tr')) ) # 排除前2行无关内容(遵循原逻辑) number_of_pages_to_enter = len(rows) - 2 xpatht_eleje = '//*[@id="wrapper"]/main/section/div/div[2]/table/tbody/tr[' cimek = '' # 使用循环变量i遍历,XPath中tr索引从1开始计数 for i in range(1, number_of_pages_to_enter + 1): # 构造当前行的链接XPath xpath_expression = f'{xpatht_eleje}{i}]/td[3]/a' button_locator = (By.XPATH, xpath_expression) button = WebDriverWait(browser, 5).until( EC.element_to_be_clickable(button_locator) ) button.click() time.sleep(0.5) # 提取子页面标题(增加等待确保元素加载完成) element = WebDriverWait(browser, 5).until( EC.presence_of_element_located((By.XPATH, '//*[@id="eventHeader"]/div[2]/div/h1')) ) cim = element.text # 累加不同标题,用换行分隔便于查看 cimek += cim + "\n" # 返回原页面并等待表格重新加载完成 browser.back() WebDriverWait(browser, 10).until( EC.presence_of_all_elements_located((By.XPATH, '//*[@id="wrapper"]/main/section/div/div[2]/table/tbody/tr')) ) # 输出结果 print(cimek)
关键优化说明
- 改用
find_elements直接获取所有目标行,统计数量更准确且不易出错。 - 循环使用
i作为tr的索引,确保按顺序遍历每个链接。 - 文本拼接改为
cimek += cim + "\n",正确累加不同子页面的标题内容。 - 返回原页面后强制等待表格重新加载,避免因DOM未渲染完成导致的定位失败。
- 将
presence_of_element_located改为element_to_be_clickable,确保链接处于可点击状态后再执行操作。
内容的提问来源于stack exchange,提问作者tompoc
相关产品推荐
相关产品推荐

