反复出现AttributeError:'NoneType'对象无'find_all'属性的问题求助
报错原因与解决方案
报错核心原因
AttributeError: 'NoneType' object has no attribute 'find_all' 本质是results变量为None——也就是soup.find('div', {'id': 'cmp-container'})没有找到匹配的元素。常见触发场景:
- 请求被反爬拦截:返回403/验证码页面等异常内容,导致解析不到目标元素
- User-Agent不合法:你使用的UA同时混合了老旧版本的Firefox和Chrome标识,极易被识别为爬虫
- 页面结构更新:Indeed的企业评论页面布局已变更,
cmp-container这个ID可能已被移除
针对性解决方案
1. 修复请求基础配置
- 替换为真实、现代的浏览器User-Agent,避免被反爬识别
- 增加请求状态码校验,确保页面正常返回
- 添加请求延时,降低反爬触发概率
2. 增加空值安全判断
在调用find_all前先检查results是否有效,避免循环因报错中断
修改后的代码示例
import requests from bs4 import BeautifulSoup import time for i in range(10,140,20): url = f'https://www.indeed.com/cmp/Ey/reviews?fcountry=IT&start={i}' # 使用真实现代浏览器的User-Agent header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'} try: page = requests.get(url, headers=header, timeout=10) # 校验请求是否成功 if page.status_code != 200: print(f"请求失败,状态码:{page.status_code},URL:{url}") continue soup = BeautifulSoup(page.content, 'lxml') results = soup.find('div', {'id': 'cmp-container'}) # 检查是否找到目标容器 if not results: print(f"未找到目标容器,URL:{url}") # 可取消注释查看页面片段,排查结构变化或反爬情况 # print(page.content[:500]) continue elems = results.find_all(class_="cmp-Review-container") # 后续处理评论的逻辑... print(f"成功抓取{len(elems)}条评论,URL:{url}") # 控制请求频率,避免反爬 time.sleep(2) except Exception as e: print(f"处理URL {url}时出错:{str(e)}") time.sleep(3)
额外排查建议
如果仍无法找到cmp-container,取消代码中print(page.content[:500])的注释,查看返回内容:
- 若返回验证码/登录提示:需增加Cookie或使用代理IP绕过反爬
- 若返回页面结构完全不同:用浏览器开发者工具重新定位评论容器的新选择器
内容的提问来源于stack exchange,提问作者Robert Becket
相关产品推荐
相关产品推荐

