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

Python抓取tatrabanka.sk汇率报错:数组长度不一致的解决咨询

解决tatrabanka.sk汇率抓取脚本的ValueError问题

问题描述

每日从tatrabanka.sk网站抓取汇率数据,网站更新后Python脚本返回ValueError: All arrays must be of the same length错误,询问处理方法及是否需要改用bs4抓取完整网站。

测试代码

import pandas as pd
import numpy as np
from datetime import datetime

tmp_url = "https://www.tatrabanka.sk/rest/tatra/exchange/list/20.11.2022-00:00"
pd.read_json(tmp_url)

报错信息

...
ValueError: All arrays must be of the same length

完整脚本

dr = pd.date_range(start = datetime.today().strftime('%m/%d/%Y'), 
              end = datetime.today().strftime('%m/%d/%Y'), 
              freq = '1440min')

df_date = pd.to_datetime(dr, format = '%Y-%m-%d').strftime('%d.%m.%Y')
df_date = df_date + '-00:00'
url_list = 'https://www.tatrabanka.sk/rest/tatra/exchange/list/' + df_date

smbl = ["USD", "PLN", "HUF", "CZK", "HRK", "RON"]
data = []


tmp_url = "https://www.tatrabanka.sk/rest/tatra/exchange/list/20.11.2022-00:00"
pd.read_json(tmp_url)
  


for urls in url_list:
    print(urls)
    dft = pd.read_json(urls)
    dft['DateReal'] = urls[51:61]
    data.append(dft.loc[dft["feCycd"].isin(smbl)])
    
out_df = pd.concat(data)

解决方案

1. 报错原因分析

pd.read_json直接解析接口返回的JSON时失败,是因为网站更新后接口返回的JSON结构发生变化,存在长度不一致的数组字段,导致pandas无法直接将其转换为标准DataFrame。

2. 修正JSON解析逻辑

不需要改用bs4,网站仍提供REST接口,只需手动解析JSON结构后再转换为DataFrame:

import pandas as pd
import requests
from datetime import datetime

# 测试接口解析
tmp_url = "https://www.tatrabanka.sk/rest/tatra/exchange/list/20.11.2022-00:00"
response = requests.get(tmp_url)
json_data = response.json()

# 查看返回结构后,提取汇率数据节点(示例假设数据在'exchangeRates'下,需根据实际返回调整)
df = pd.DataFrame(json_data['exchangeRates'])
print(df.head())

3. 修正完整脚本的URL列表生成逻辑

原脚本中url_list的生成方式错误,会导致遍历的是字符串的每个字符而非完整URL,需调整为列表推导式:

# 生成日期范围
dr = pd.date_range(start=datetime.today().strftime('%m/%d/%Y'), 
                   end=datetime.today().strftime('%m/%d/%Y'), 
                   freq='1440min')
df_date = pd.to_datetime(dr, format='%Y-%m-%d').strftime('%d.%m.%Y')
df_date = df_date + '-00:00'

# 正确生成URL列表
url_list = ['https://www.tatrabanka.sk/rest/tatra/exchange/list/' + date_str for date_str in df_date]

smbl = ["USD", "PLN", "HUF", "CZK", "HRK", "RON"]
data = []

for url in url_list:
    print(url)
    response = requests.get(url)
    json_data = response.json()
    dft = pd.DataFrame(json_data['exchangeRates'])  # 替换为实际数据节点
    dft['DateReal'] = url[51:61]
    data.append(dft.loc[dft["feCycd"].isin(smbl)])
    
out_df = pd.concat(data)
print(out_df)

4. 是否需要改用bs4?

不需要。REST接口返回的数据结构虽然变化,但仍结构化,直接解析接口比抓取页面更高效、稳定,且维护成本更低。只有当接口彻底关闭时,再考虑改用bs4抓取页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:05:17