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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:26:54