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

使用Selenium抓取网页每行唯一id,循环出现NoSuchElementException如何解决

错误根因

NoSuchElementException报错核心原因如下:

  1. 选择器不匹配:代码中使用.party-card作为CSS选择器,实际页面目标元素的类为data-party-id,二者不一致导致无法定位元素
  2. 部分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 22:27:03