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

