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

BeautifulSoup报错'NoneType'无find_all属性错误求解

报错根因

执行代码抛出AttributeError: 'NoneType' object has no attribute 'find_all'的直接原因是tabpane = soup.find('div', 'tabpane')这行没有匹配到任何DOM元素,返回了空值None,后续对None调用find_all方法自然触发属性不存在的错误。
找不到对应元素的两个核心诱因:

  • 代码里user-agent字符串被意外断行,实际发起请求时携带的UA标识残缺,网站反爬机制识别到异常请求,返回了拦截页而非正常的财报日历页面
  • 目标网站页面结构已经迭代更新,旧代码里查找class为tabpane的div容器的选择器已经完全失效,正常页面里也不存在这个节点
修复方案

按以下顺序调整代码即可正常运行:

  • 修正headers里的user-agent格式,删除字符串中间的多余换行,保证UA值完整
  • 移除已经失效的tabpane查找逻辑,不要无差别遍历所有div节点,直接通过id前缀规则匹配页面中承载财报数据的目标div容器,避免匹配到无关节点导致后续解析报错
  • 增加基础的请求状态校验、空值判断,避免请求异常时直接抛出无参考意义的属性错误
  • 适配新版pandas的ExcelWriter写法,用上下文管理器自动完成文件保存,不需要手动调用save方法
修复后完整代码
import datetime
import pandas as pd
import requests
from bs4 import BeautifulSoup

# 修正断行的请求头,保证UA完整
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0',
}
url = 'https://www.marketwatch.com/tools/earningscalendar'
response = requests.get(url, headers=headers)
# 增加请求状态校验
response.raise_for_status()
soup = BeautifulSoup(response.content, 'html.parser')

# 替换失效的tabpane选择器,直接通过id前缀匹配承载财报表格的目标div
earning_tables = soup.find_all('div', {'id': lambda x: x and x.startswith('page')})
if not earning_tables:
    raise RuntimeError("未找到财报表格内容,可能被网站反爬拦截,请稍后重试或调整请求头")

dfs = {}
current_datetime = datetime.datetime.now().strftime('%m-%d-%y %H_%M_%S')
file_name = f'Earning Calendar ({current_datetime}).xlsx'
# 用上下文管理器处理Excel写入,自动完成保存
with pd.ExcelWriter(file_name, engine='openpyxl') as xlsxwriter:
    for earning_table in earning_tables:
        if 'Sorry, this date currently does not have any earnings announcements scheduled' not in earning_table.text:
            earning_date = earning_table['id'].replace('page', '')
            earning_date = earning_date[:3] + '_' + earning_date[3:]
            print(earning_date)
            dfs[earning_date] = pd.read_html(str(earning_table.table))[0]
            dfs[earning_date].to_excel(xlsxwriter, sheet_name=earning_date, index=False)

print('earning tables Excel file exported')

注意:运行前如果缺少openpyxl依赖,执行pip install openpyxl安装即可,新版pandas写入xlsx文件需要这个引擎支持。

内容的提问来源于stack exchange,提问作者ABe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:42:24