Python网页爬取报错:'NoneType' object has no attribute 'h2' 求助
排查国际球员爬取脚本
'NoneType' object has no attribute 'h2'错误的方案 错误核心原因
这个错误本质是:你代码中用于定位元素的查询返回了None,但你直接调用了它的.h2属性——简单说就是国际球员页面里,你要找的包含h2标签的父元素不存在,或者查询逻辑和页面实际结构不匹配。
具体排查步骤
- 锁定出错代码行:先找到脚本里出现类似
xxx.h2的代码位置,这个xxx就是返回None的对象,通常是soup.find()或soup.select_one()的查询结果。 - 对比页面实际结构:
- 挑一个报错的国际球员URL,手动打开后按F12查看页面源码;
- 和G League球员页面的对应区域对比,重点看你用来提取pos1、pos2的h2标签所在的父容器(比如类名、层级结构);
- 注意:看似一致的页面可能存在细微差异——比如类名大小写不同、多了一层嵌套标签、或者h2被包裹在其他元素里。
- 检查是否是动态内容:如果国际球员页面的球员信息是通过JS动态加载的,用
requests直接爬取只能拿到静态HTML骨架,自然找不到目标元素。这种情况需要改用selenium或playwright模拟浏览器渲染。
代码修复建议
1. 增加存在性判断,避免直接调用属性
# 原错误代码示例(直接调用属性会报错): player_info = soup.find('div', class_='player-profile') pos1 = player_info.h2.get_text(strip=True) # 修改为带判断的安全写法: player_info = soup.find('div', class_='player-profile') if player_info and player_info.h2: pos1 = player_info.h2.get_text(strip=True) else: pos1 = None # 或记录错误URL到日志 print(f"处理URL {url}时未找到目标h2标签")
2. 打印调试信息,验证爬取内容
如果怀疑爬取到的页面和手动看到的不一致,把响应内容存到本地文件检查:
import requests url = "出错的国际球员URL" response = requests.get(url) # 先确认请求是否成功 print(f"响应状态码:{response.status_code}") # 保存页面到本地 with open('debug_international_player.html', 'w', encoding='utf-8') as f: f.write(response.text)
打开生成的debug_international_player.html,搜索是否存在你要找的h2标签。
3. 检查反爬机制
如果响应状态码不是200,或者页面内容是反爬提示,需要添加请求头模拟浏览器:
headers = { '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' } response = requests.get(url, headers=headers)
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

