使用Selenium抓取网页每行唯一id,循环出现NoSuchElementException如何解决
错误根因
NoSuchElementException报错核心原因如下:
- 选择器不匹配:代码中使用
.party-card作为CSS选择器,实际页面目标元素的类为data-party-id,二者不一致导致无法定位元素 - 部分
k-detail-cell节点下不存在对应目标元素,遍历到此类节点时直接抛出异常,导致程序中断
优化方案
- 修正CSS选择器:将
.party-card替换为与实际页面结构匹配的.data-party-id - 增加异常捕获逻辑:遍历节点时添加try-except捕获元素定位异常,跳过无效节点,避免程序整体崩溃
- 替换兼容型API:
find_element_by_*系列方法在Selenium4中已废弃,建议改用find_element(By.XXX, 定位符)的统一写法,适配不同版本的Selenium环境 - 增加显式等待:替代手动input等待的方案,自动判定元素加载状态,提升脚本运行稳定性
优化后代码
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 op = webdriver.ChromeOptions() # 可按需添加无头、无沙箱等启动配置 # op.add_argument('--headless=new') # op.add_argument('--no-sandbox') driver = webdriver.Chrome(options=op, executable_path="/usr/local/bin/chromedriver") driver.get(web) # 等待搜索框加载完成后输入检索内容 search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="caseCriteria_SearchCriteria"]')) ) search_box.send_keys(keys) # 等待所有列表节点加载完成 WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'k-detail-cell')) ) content = driver.find_elements(By.CLASS_NAME, 'k-detail-cell') for c in content: try: # 使用匹配实际页面结构的选择器 target_node = c.find_element(By.CSS_SELECTOR, '.data-party-id') node_id = target_node.get_attribute('id') print(node_id) except: # 无对应目标元素的节点直接跳过 continue driver.quit()
补充排查方案
如果调整后仍存在定位失败的问题,可在遍历节点时打印c.get_attribute('innerHTML')输出节点源码,确认节点结构是否符合预期,排查是否存在动态渲染未完成的问题。
内容的提问来源于stack exchange,提问作者CodingStark
相关产品推荐
相关产品推荐

