Python网页爬虫出现TypeError: 'NoneType' object is not subscriptable错误如何修复?
Python爬虫TypeError问题解决方案
错误触发原因
当前TypeError由链式调用属性时中间节点为空导致,常见触发场景如下:
findAll返回的data列表长度不足3,取data[2]时要么触发索引错误,要么取到的节点结构不符合预期- 匹配到的
data[2]节点下没有div子节点,data[2].div返回None div节点下没有img子节点,data[2].div.img返回Noneimg节点不存在alt属性,直接用['alt']取值会触发键错误,部分场景下也会关联触发类型错误- 目标站点的
_2kHMtA类是前端动态生成的,urllib请求拿到的是未渲染JS的静态页面,根本没有对应结构的节点
可行修复方案
1. 拆分链式调用,增加非空校验
将连写的属性调用拆分为分步判断,避免对None类型操作:
# 先校验列表长度是否符合预期 if len(data) >= 3: target_div = data[2] # 校验div子节点是否存在 child_div = target_div.div if not child_div: print("目标节点下无div子节点") exit() # 校验img节点是否存在 img_tag = child_div.img if not img_tag: print("div节点下无img子节点") exit() # 用get方法取属性,不存在时返回默认值避免报错 y = img_tag.get("alt", "alt属性不存在") print(y) else: print(f"匹配到的class为_2kHMtA的div数量仅为{len(data)},不足3个") # 可打印页面源码确认是否匹配到了正确内容 # print(page_soup.prettify())
2. 排查页面渲染问题
如果运行上述代码提示匹配到的div数量为0,说明静态请求无法拿到对应节点,原因是目标内容是JS异步渲染的,需要改用支持JS渲染的爬虫工具:
- 可替换为Selenium、Playwright等无头浏览器工具发起请求,拿到渲染后的完整页面源码再做解析
- 也可以直接抓站点的异步数据接口,直接请求接口拿结构化数据,比解析HTML更稳定
3. 排查反爬拦截
如果页面源码和浏览器中看到的不一致,说明请求被站点反爬策略拦截,需增加请求头(User-Agent、Cookie等)、配置代理后再重试请求。
内容的提问来源于stack exchange,提问作者SavageTomato
相关产品推荐
相关产品推荐

