Python爬虫已声明全局变量仍报NameError,该如何修复?
解决你的Python爬虫“变量未定义”问题
嘿,作为编程新手遇到这种问题太正常啦,我帮你拆解下代码里的问题:
首先,你提到的“变量未定义”错误,其实大概率不是global声明的问题,而是你的元素查找逻辑有漏洞,导致程序运行中抛出异常,让你误以为是变量没定义。具体来看:
问题1:元素查找可能返回None,直接调用.text会报错
当each.find(...)找不到对应的元素时,会返回None,这时候你直接调用.text就会抛出AttributeError,程序直接中断,后续的变量赋值根本没机会完成,看起来就像是“变量未定义”。比如某个商品没有销量数据,each.find("div",class_="_18SLBt")就会返回None,执行soldnum.text瞬间就会报错。
问题2:明显的赋值笔误
你这里写错了关键代码:
soldnum=each.find("div",class_="_18SLBt") soldnum=price.text # 这里应该是soldnum.text,你写成price.text了!
这不仅会导致销量数据完全错误,还会在soldnum本身是None时触发报错。
修复后的代码
我帮你调整了代码,解决了这些问题,同时去掉了不必要的global声明(你根本不需要全局变量,反而会增加不必要的复杂度):
import requests from bs4 import BeautifulSoup def get_products(): headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'accept-encoding':'gzip, deflate, br', 'accept-language':'zh-CN,zh;q=0.9' } for i in range(0,10): link = f'https://shopee.sg/miniso_singapore?page={i}' # 用f-string拼接更简洁 r = requests.get(link, headers=headers) soup = BeautifulSoup(r.text, "lxml") product_list = soup.find_all("div", class_="shop-search-result-view__item col-xs-2-4") for each in product_list: # 先检查元素是否存在,再获取文本,避免报错 name_elem = each.find("div", class_="_1NoI8__2gr36I") name = name_elem.text.strip() if name_elem else "无商品名" price_elem = each.find("span", class_="_341bF0") price = price_elem.text.strip() if price_elem else "无价格" soldnum_elem = each.find("div", class_="_18SLBt") soldnum = soldnum_elem.text.strip() if soldnum_elem else "无销量" print(name, price, soldnum) get_products()
关键修改点说明:
- 用f-string拼接URL,比字符串相加更清晰易读
- 每个元素查找后先判断是否为
None,再调用.text,避免程序中断 - 修正了
soldnum的赋值笔误 - 去掉了不必要的
global声明,函数内部的变量完全不需要全局化 - 用
.strip()去掉文本前后的空格,让输出更整洁
这样修改后,即使某个商品缺少某个字段,程序也能继续运行,不会再出现“变量未定义”的问题啦。
内容的提问来源于stack exchange,提问作者Poppy Bee
相关产品推荐
相关产品推荐

