Python调用API提取数据时遭遇IndexError问题求助
API数据提取IndexError问题修复
问题根源
- 正则表达式错误:原代码中
re.findall('d+', ...)的d未转义,无法匹配数字,导致返回空列表后取索引[0]报错 - 未处理
totalcount标签缺失的情况:如果API返回中没有该标签,str(bs.find('totalcount'))会得到<None>,正则匹配不到任何内容 - 循环逻辑不合理:固定循环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
相关产品推荐
相关产品推荐

