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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:18:05