You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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返回None
  • img节点不存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:09:00