Python网页爬虫报AttributeError: 'NoneType'无findAll属性如何解决
错误原因分析
- 报错指向
for i in l.findAll("a")行,错误类型为AttributeError,本质是调用findAll的变量l为None空值,没有对应的方法属性 l由BeautifulSoup.find()方法返回,该方法默认在未匹配到符合条件的DOM节点时,直接返回None而非抛出异常,才会触发后续调用报错- 触发节点匹配失败的常见场景:
- 目标站点前端结构迭代,对应的
h2标签或etikett bottom-spacing-medium类名已变更 - 站点配置了反爬策略,虽然返回200状态码,但实际内容为拦截页、验证码页,不存在目标节点
- 多类名匹配写法不兼容当前BeautifulSoup版本,导致匹配逻辑失效
- 目标内容为前端JS动态渲染生成,
requests仅能获取静态HTML源码,不存在对应节点
- 目标站点前端结构迭代,对应的
修复方案
第一步:添加非空判断避免直接崩溃
优先对find的返回值做校验,匹配失败时输出排查信息而非直接报错,修改后代码如下:
import requests from bs4 import BeautifulSoup # 注意提前定义url2变量为目标页面地址 url2 = "待填写的目标页面URL" def sv(): url = url2 # 添加请求头模拟浏览器,避免被基础反爬策略拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } resp=requests.get(url, headers=headers, timeout=10) if resp.status_code==200: print("Managed to connect to the website.") print("Info :-\n") soup=BeautifulSoup(resp.text,'html.parser') # 使用官方推荐的class_参数传递多类名,兼容性更好 l=soup.find("h2", class_="etikett bottom-spacing-medium") # 新增非空校验 if l: # BeautifulSoup4推荐使用find_all()替代旧写法findAll(),功能完全一致 for i in l.find_all("a"): print(i.text) else: print("未匹配到目标节点,返回页面前500字符内容如下:") print(resp.text[:500]) else: print(f"请求失败,状态码:{resp.status_code}") sv()
第二步:根据校验结果针对性解决
- 若输出的页面内容为拦截/验证码页:可进一步添加Cookie、代理IP等配置绕过反爬
- 若页面内容中确实没有目标节点:确认是否为JS动态渲染,可改用Selenium、Playwright等支持JS渲染的工具爬取,或直接抓包获取异步数据接口
- 若类名匹配失效:可先打印所有
h2标签的类名,确认实际类名是否和预期一致,再调整匹配规则
内容的提问来源于stack exchange,提问作者Eide
相关产品推荐
相关产品推荐

