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

Python Selenium爬虫运行报UnboundLocalError局部变量错误

问题根因

immunte函数触发UnboundLocalError的核心原因非常明确:

  • 函数内所有给al赋值的逻辑都写在if/elif/try这类条件/异常捕获分支里,只要程序运行时所有分支的触发条件都没满足(比如Selenium定位元素失败、页面结构变动没匹配到判断规则、爬取请求超时直接跳走流程),al从始至终就不会被创建,执行到return al的时候自然会报“引用前未赋值”的错。
  • 你加global关键字修不好的原因也很简单:要么全局作用域里根本没定义过al,声明全局也找不到对应变量;要么爬虫运行时存在多轮调用、异常重试的逻辑,全局变量的值被其他流程意外修改/清空,要么出其他作用域相关的报错,要么原来的问题复现。
修复步骤

按顺序改,不需要加全局变量:

  1. 进入immunte函数,在所有业务逻辑、条件判断的最前面,给al设置和业务匹配的默认初始值——比如你要返回列表就设al = [],返回字符串就设al = "",返回状态标记就设al = None,保证不管后续分支怎么走,al这个变量一定是提前定义过的。
    参考代码结构:
    def immunte(driver, *args):
        # 函数入口先初始化变量
        al = []
        # 下面保留原来的所有业务逻辑
        try:
            ele = driver.find_element(By.ID, "target")
            if ele.text == "xxx":
                al = ele.text
            elif ele.get_attribute("class") == "yyy":
                al = ele.get_attribute("href")
        except NoSuchElementException:
            # 异常分支也要给al赋值,别留空
            al = []
        # 最后return就不会报错
        return al
    
  2. 补全所有遗漏的分支赋值:尤其是Selenium运行时的异常分支(元素不存在、超时、弹窗拦截)、条件判断的else兜底分支,保证所有可能的执行路径下,al都会被赋值,不要留流程缺口。
验证方法

改完后可以临时在每个赋值分支后加打印,跑几次爬虫就能确认之前漏了哪个场景:

if 匹配规则A:
    al = 对应值
    print("debug: 命中规则A,al已赋值")
elif 匹配规则B:
    al = 对应值
    print("debug: 命中规则B,al已赋值")
else:
    al = 兜底值
    print("debug: 未命中任何规则,走兜底逻辑")

爬虫场景尽量不要用全局变量存中间值,Selenium运行时页面状态波动大,全局变量很容易被异步逻辑、异常重试改乱,函数内局部变量初始化+全分支赋值的写法稳定性高很多,也方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:42:18