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

Python调用API提取数据时遭遇IndexError问题求助

API数据提取IndexError问题修复

问题根源

  1. 正则表达式错误:原代码中re.findall('d+', ...)的d未转义,无法匹配数字,导致返回空列表后取索引[0]报错
  2. 未处理totalcount标签缺失的情况:如果API返回中没有该标签,str(bs.find('totalcount'))会得到<None>,正则匹配不到任何内容
  3. 循环逻辑不合理:固定循环1000次,若当前页返回结果不足1000条,会触发索引越界

修改后的完整代码

import requests
from bs4 import BeautifulSoup
import re

z = 11
# 请替换为你的API地址和密钥
# url = "你的API基础地址"
# ServiceKey = "你的服务密钥"

names = []  
charge_types = []  
addresses = []  # 修正拼写错误:addresss -> addresses
latitudes = [] 
longitudes = []  
states = []  
outputs = []  
methods = []  
zcodes = []  
limityns = []  
limitdetails = []  
parking_frees = []  

page_num = 1
while True:
    try:
        # 构造请求URL,requests自动处理编码,无需手动encode
        response_url = f"{url}ServiceKey={ServiceKey}&numOfRows=1000&pageNo={page_num}&zcode={z}"
        req = requests.get(response_url)
        req.raise_for_status()  # 捕获HTTP请求错误(如404、500)
        bs = BeautifulSoup(req.text, 'html.parser')

        # 获取当前页各字段数据列表
        name_list = bs.findAll('statnm')
        charge_type_list = bs.findAll('chgertype')
        address_list = bs.findAll('addr')
        latitude_list = bs.findAll('lat')
        longitude_list = bs.findAll('lng')
        state_list = bs.findAll('stat')
        output_list = bs.findAll('output')
        method_list = bs.findAll('method')
        zcode_list = bs.findAll('zcode')
        limityn_list = bs.findAll('limitYn')
        limitdetail_list = bs.findAll('limitDetail')
        parking_free_list = bs.findAll('parkingfree')

        # 处理totalcount,增加容错逻辑
        total_count_tag = bs.find('totalcount')
        if not total_count_tag:
            print("未找到totalcount标签,终止请求")
            break
        total_num_text = total_count_tag.text.strip()
        total_match = re.findall(r'\d+', total_num_text)
        if not total_match:
            print("无法从totalcount中提取有效数字,终止请求")
            break
        total = int(total_match[0])

        # 确定当前页实际要处理的条目数:取预期数和实际返回数的最小值
        expected_count = 1000 if page_num < total // 1000 + 1 else total % 1000
        actual_count = len(name_list)
        process_count = min(expected_count, actual_count)

        # 遍历当前页数据
        for i in range(process_count):
            names.append(name_list[i].text.strip())
            charge_types.append(charge_type_list[i].text.strip())
            addresses.append(address_list[i].text.strip())
            latitudes.append(latitude_list[i].text.strip())
            longitudes.append(longitude_list[i].text.strip())
            states.append(state_list[i].text.strip())
            outputs.append(output_list[i].text.strip())
            methods.append(method_list[i].text.strip())
            zcodes.append(zcode_list[i].text.strip())
            
            # 单独处理可选字段,避免一个字段缺失影响其他字段
            try:
                limityns.append(limityn_list[i].text.strip())
            except IndexError:
                limityns.append('')
            try:
                limitdetails.append(limitdetail_list[i].text.strip())
            except IndexError:
                limitdetails.append('')
                
            parking_frees.append(parking_free_list[i].text.strip())

        # 翻页判断
        if page_num < total // 1000 + 1:
            page_num += 1
        else:
            break
            
    except requests.exceptions.RequestException as e:
        print(f"请求出错:{e}")
        break
    except Exception as e:
        print(f"数据处理出错:{e}")
        break

关键修改点说明

  • 正则表达式修正:使用r'\d+'匹配数字,原代码'd+'只会匹配字母d,导致返回空列表
  • totalcount容错处理:先检查标签是否存在,再提取文本并匹配数字,避免因标签缺失或格式异常报错
  • 循环长度优化:用min(expected_count, actual_count)确定循环次数,避免实际返回结果不足时触发索引越界
  • 变量名修正:修正addresss为addresses,避免拼写错误
  • 请求异常处理:捕获HTTP请求错误和其他异常,避免程序直接崩溃,同时输出错误信息便于调试
  • 文本处理优化:添加.strip()去除文本前后空白字符,提升数据整洁度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:57:09