爬取SEC网站10-K表格时找不到表格触发索引错误求助
解决SEC EDGAR 10-K表格抓取时的IndexError问题
问题场景
调试抓取SEC网站某公司(CIK=1265107)10-K表格的代码,使用requests、pandas、BeautifulSoup库。请求EDGAR浏览器链接返回成功响应,但查找class为tableFile2的表格并遍历行时触发IndexError: 列表索引超出范围,本质是doc_table为空列表。目标链接:
https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=1265107&type=10-k&dateb=20190101&owner=exclude&start=&output=&count=100
相关代码
导入库:
import requests import pandas as pd from bs4 import BeautifulSoup
搜索参数定义:
endpoint = r"https://www.sec.gov/cgi-bin/browse-edgar" param_dict = {'action':'getcompany', 'CIK':'1265107', 'type':'10-k', 'dateb':'20190101', 'owner':'exclude', 'start':'', 'output':'', 'count':'100'} response = requests.get(url = endpoint, params = param_dict) soup = BeautifulSoup(response.content, 'html.parser') print('Request Successful') print(response.url)
问题代码段:
doc_table = soup.find_all('table', class_='tableFile2') base_url_sec = r"https://www.sec.gov" master_list = [] # 触发错误的行 for row in doc_table[0].find_all('tr'): # 后续逻辑 pass
错误信息:
IndexError: 列表索引超出范围
问题原因
- 反爬拦截:SEC EDGAR会拦截无标识的请求,返回的页面可能是反爬提示页而非目标内容,导致找不到
tableFile2表格。 - 页面结构变更:目标表格的class属性可能已更新,不再是
tableFile2。
修复方案
1. 添加请求头模拟浏览器访问
给requests请求添加User-Agent头,模拟正常浏览器行为,绕过基础反爬:
# 新增请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 修改请求,传入headers response = requests.get(url=endpoint, params=param_dict, headers=headers)
2. 验证页面结构并调整查找逻辑
先打印返回页面的部分内容,确认是否为目标页面:
print(soup.text[:500]) # 打印前500字符,检查是否是反爬提示或结构变化
如果表格class已变更,通过浏览器开发者工具重新定位表格属性,比如改用summary属性查找:
# 替换为实际找到的表格属性 doc_table = soup.find_all('table', {'summary': 'Results'})
3. 添加异常处理避免崩溃
在访问doc_table[0]前先判断列表是否为空:
doc_table = soup.find_all('table', class_='tableFile2') if not doc_table: print("未找到目标表格,请检查请求头或页面结构") else: for row in doc_table[0].find_all('tr'): # 处理每行数据的逻辑 pass
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

