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

Python新手爬取伊朗央行.aspx页面遇索引错误,求助获取表格数据

问题分析与解决方案

错误原因

触发IndexError的核心原因是soup.find_all("input",type="hidden")返回的列表为空,大概率是以下两点导致:

  • 首次请求缺少必要请求头(比如User-Agent),网站返回了不含表单元素的内容(如反爬拦截页、错误页)
  • 页面结构与预期不符,hidden输入项的位置或属性发生了变化

你提到的hidden value,这类是ASP.NET页面的视图状态参数(常见如__VIEWSTATE、__EVENTVALIDATION),用来维持页面会话状态、验证请求合法性,服务器会强制校验这些参数,必须随POST请求一起提交。

修复步骤

1. 添加请求头模拟浏览器

网站会校验请求来源,添加User-Agent等标识,确保返回正常页面内容。

2. 安全提取hidden参数

避免直接通过索引访问列表元素,改为遍历所有hidden input自动构建提交数据,彻底规避索引越界问题。

3. 规范请求流程

先GET获取表单页面→提取必要参数→POST提交同意→再GET目标页面。

修改后的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 初始化会话并添加浏览器请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}

session = requests.Session()
session.headers.update(headers)

target_url = "https://www.cbi.ir/PolicyRates/policyrates_fa.aspx"

# 第一步:GET请求获取表单页面
initial_res = session.get(target_url, verify=False)
soup = BeautifulSoup(initial_res.content, "lxml")

# 自动收集所有hidden参数
submit_data = {}
hidden_inputs = soup.find_all("input", type="hidden")
for input_tag in hidden_inputs:
    if "name" in input_tag.attrs and "value" in input_tag.attrs:
        submit_data[input_tag["name"]] = input_tag["value"]

# 添加同意按钮参数
submit_data["btnAccept"] = "Yes, I accept"

# 第二步:POST提交同意请求
session.post(target_url, data=submit_data, verify=False)

# 第三步:获取包含表格的目标页面
final_res = session.get(target_url, verify=False)

# 使用pandas解析表格(根据实际页面调整索引)
tables = pd.read_html(final_res.content)
print(tables[0])

关键说明

  • 用循环遍历hidden input自动收集参数,彻底避免硬编码索引导致的越界错误
  • User-Agent是绕开基础反爬的核心,无标识请求大概率会被网站拦截
  • verify=False仅用于临时跳过SSL证书校验,生产环境建议处理证书问题而非直接关闭

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:06:29