BeautifulSoup爬取报错:NameError: name 'soup' is not defined 求助
问题排查与解决方案
嘿,这个问题一眼就能看出来——就是个典型的变量名拼写失误!咱们一步步来解决:
1. 直接触发报错的核心原因
看你parsePrice函数里的这段代码:
soap=bs4.BeautifulSoup(r.text, 'xml') price=soup.find('span', {'class': 'Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)'}).text
你把BeautifulSoup的实例赋值给了soap(字母o),但后面调用查找元素时却写了soup(字母u),Python找不到soup这个未定义的变量,所以抛出了NameError。
修复方法:把变量名统一成soup,同时建议把解析器从xml换成更适合HTML页面的html.parser(Python内置,无需额外安装):
soup=bs4.BeautifulSoup(r.text, 'html.parser')
2. 额外优化建议(避免后续踩坑)
- 增加请求异常处理:网络波动、页面访问限制都可能导致请求失败,加个异常捕获能让程序更健壮:
- 处理元素找不到的情况:Yahoo Finance的页面结构可能随时更新,要是目标class被修改,程序不会直接崩溃,还能给出提示。
修复后的完整代码
import bs4 import requests from bs4 import BeautifulSoup def parsePrice(): try: r=requests.get('https://finance.yahoo.com/quote/FB?p=FB') r.raise_for_status() # 检查请求是否成功返回200状态码 soup=bs4.BeautifulSoup(r.text, 'html.parser') price=soup.find('span', {'class': 'Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)'}).text return price except requests.exceptions.RequestException as e: return f"请求出错啦: {str(e)}" except AttributeError: return "找不到价格元素,可能页面结构已更新" while True: print('The current price is: ') print(parsePrice())
内容的提问来源于stack exchange,提问作者The X and D




