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

Selenium捕获NoSuchElementException后跳转下URL抓取最多5条结果问题

问题原因

你代码的核心逻辑错误是:每次捕获NoSuchElementException后直接调用了continue,这会直接终止当前URL的所有剩余处理步骤,直接跳转至下一个URL,自然无法完成剩余结果位补None的操作。同时你当前的页面等待逻辑是等待第2条结果对应的元素渲染,若某URL结果不足2条,会直接在等待阶段超时抛出异常,后续逻辑完全无法执行。

修改方案

调整等待逻辑,只需要根节点加载完成即可;同时将异常捕获后的continue替换为补全剩余None后再终止当前URL的处理,修改后代码如下:

from selenium.common.exceptions import NoSuchElementException

group_url = [
'https://www.example1.com',
'https://www.example2.com',
'https://www.example3.com'
]

data = []

for group in group_url:
    driver.get(group)
    wait = WebDriverWait(driver, 90)
    # 修改等待逻辑,只要根节点加载完成即可,不要等第2条结果
    element = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="root"]')))
    # 标记当前抓取到第几条
    current_idx = 0
    try:
        kw1 = driver.find_element_by_xpath('//*[@id="root"]/div')
        vol1 = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]')
        url1 = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/main/')
        data.append({
            "Result 1": (kw1.text, vol1.text, url1.text)
            })
        current_idx = 1
    except NoSuchElementException:
        data.append({"Result 1": None})
        current_idx = 0
    # 第一条抓取失败,直接补剩下4个None
    if current_idx == 0:
        for i in range(2,6):
            data.append({f"Result {i}": None})
        continue
    try:
        kw2 = driver.find_element_by_xpath('//*[@id="root"]/div')
        vol2 = driver.find_element_by_xpath('//*[@id="root"]/div/div[2]')
        url2 = driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/main/')
        data.append({
            "Result 2": (kw2.text, vol2.text, url2.text)
            })
        current_idx = 2
    except NoSuchElementException:
        data.append({"Result 2": None})
        current_idx = 1
    # 第二条抓取失败,补剩下3个None
    if current_idx == 1:
        for i in range(3,6):
            data.append({f"Result {i}": None})
        continue
    try:
        kw3 = driver.find_element_by_xpath('//*[@id="root"]/div')
        vol3 = driver.find_element_by_xpath('//*[@id="root"]/div/div[3]')
        url3 = driver.find_element_by_xpath('//*[@id="root"]/div/div[3]/main/')
        data.append({
            "Result 3": (kw3.text, vol3.text, url3.text)
            })
        current_idx = 3
    except NoSuchElementException:
        data.append({"Result 3": None})
        current_idx = 2
    if current_idx == 2:
        for i in range(4,6):
            data.append({f"Result {i}": None})
        continue
    try:
        kw4 = driver.find_element_by_xpath('//*[@id="root"]/div')
        vol4 = driver.find_element_by_xpath('//*[@id="root"]/div/div[4]')
        url4 = driver.find_element_by_xpath('//*[@id="root"]/div/div[4]/main/')
        data.append({
            "Result 4": (kw4.text, vol4.text, url4.text)
            })
        current_idx =4
    except NoSuchElementException:
        data.append({"Result 4": None})
        current_idx =3
    if current_idx ==3:
        data.append({"Result 5": None})
        continue
    try:
        kw5 = driver.find_element_by_xpath('//*[@id="root"]/div')
        vol5 = driver.find_element_by_xpath('//*[@id="root"]/div/div[5]')
        url5 = driver.find_element_by_xpath('//*[@id="root"]/div/div[5]/main/')
        data.append({
            "Result 5": (kw5.text, vol5.text, url5.text)
            })
    except NoSuchElementException:
        data.append({"Result 5": None})

driver.close()
print(data)
修改说明
  • 调整了页面等待规则,仅等待根节点//*[@id="root"]渲染完成,避免结果不足2条的页面直接在等待阶段超时
  • 新增了当前抓取进度标记current_idx,一旦某条结果抓取失败,会自动补全后续所有不足5条的None值,再跳转至下一个URL
  • 保留了你要求的单条XPath定位元素的逻辑,没有修改抓取规则

内容的提问来源于stack exchange,提问作者VRapport

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:45:04