Selenium网页爬虫点击失效求助:无法点击表格Quest编号
问题分析与解决方案
你的代码能打印Quest编号但点击失效,核心问题出在这几个地方:
- 定位的是
<td>元素而非实际可点击的<a>链接标签,点击td无法触发跳转逻辑 - 全局XPath会导致页面回退后出现陈旧元素引用异常,之前定位的元素无法再操作
- 等待代码存在语法断裂错误,导致等待逻辑失效
- 缺失
time模块导入,代码会报错
修正步骤
- 定位真实可点击元素:表格中Quest编号嵌套在
<td>内的<a>标签里,直接定位该链接才能触发跳转 - 使用相对XPath:基于已加载的表格元素用相对路径定位子元素,避免全局定位引发的元素失效问题
- 修复语法错误:将断裂的等待代码合并为完整语句
- 补充缺失模块:添加
import time导入语句
修改后的完整代码
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 time # 导入缺失的time模块 driver = webdriver.Chrome() # 打开目标网站 driver.get('https://qcpi.questcdn.com/cdn/posting/?group=1950787&provider=1950787') # 等待表格加载完成 table = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, 'table_id'))) # 循环处理每个Quest编号链接(每次回退后重新获取元素,避免陈旧引用) while True: # 回到列表页后重新获取所有链接 quest_links = table.find_elements(By.XPATH, './/tbody//tr//td[2]/a') if not quest_links: break for link in quest_links: quest_number_text = link.text print(f"正在处理Quest编号:{quest_number_text}") # 等待元素可点击后再点击 WebDriverWait(driver, 10).until(EC.element_to_be_clickable(link)).click() # 等待详情页核心元素加载完成 WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.CLASS_NAME, 'posting-second-header'))) # 获取并处理页面源码 page_source = driver.page_source print(f"Quest编号:{quest_number_text}") # 可选:将源码保存为本地文件 # with open(f"{quest_number_text}.html", "w", encoding="utf-8") as f: # f.write(page_source) # 返回列表页并等待加载完成 driver.back() WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, 'table_id'))) # 关闭浏览器 driver.quit()
额外说明
- 每次回退后重新获取链接,是因为浏览器回退操作会使之前的元素引用失效,必须重新定位
- 使用
element_to_be_clickable等待元素状态,比直接执行JS点击更稳定,能避免元素被遮挡或未完全加载的问题
内容的提问来源于stack exchange,提问作者SHUBHAM SHEKHAR 20GCEBCS091
相关产品推荐
相关产品推荐

