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
相关产品推荐
相关产品推荐

