Python遍历Excel隔列调用Zefix API时出现KeyError: 'list'问题求助
修复Excel遍历与Zefix API调用的KeyError问题
问题描述
我需要遍历Excel文件中从B列开始的每一列(每行存储一个公司名称),手动输入公司名称时代码能正常提取法律形式,但用循环实现时出现KeyError: 'list'错误,无法批量打印对应法律形式,该怎么修复?
原代码
import json import requests import os import pandas as pd results_folder = r'C:\Users\...' results_file = os.path.join(results_folder, 'Companies.xlsx') results_df = pd.read_excel(results_file, header=None) # read every second column, starting with column B in the xlsx file results = results_df[results_df.columns[1::2]] # legal form for name in results: legal_forms_url = "https://www.zefix.ch/ZefixREST/api/v1/legalForm.json" search_api = "https://www.zefix.ch/ZefixREST/api/v1/firm/search.json" legal_forms = {f["id"]: f for f in requests.get(legal_forms_url).json()} payload = { "languageKey": "en", "maxEntries": 30, "name": name, "offset": 0, "searchType": "exact", } data = requests.post(search_api, json=payload).json() print(legal_forms[data["list"][0]["legalFormId"]]["name"]["en"])
错误信息
Traceback (most recent call last): File "C:\Users\User\PycharmProjects\pythonProject\11_test.py", line 27, in <module> print(legal_forms[data["list"][0]["legalFormId"]]["name"]["en"]) ~~~~^^^^^^^^ KeyError: 'list'
错误原因
- 遍历对象错误:
for name in results遍历的是DataFrame的列名,不是单元格里的公司名称,导致API用列名搜索无结果,返回的JSON没有list字段。 - 未处理无结果情况:即使遍历正确,若公司名称不存在、为空或API返回无匹配结果,JSON也不会有
list字段,直接访问会触发KeyError。 - 重复API请求:每次循环都请求法律形式列表,浪费资源且降低效率。
修复方案
修复后的完整代码
import requests import os import pandas as pd results_folder = r'C:\Users\...' results_file = os.path.join(results_folder, 'Companies.xlsx') results_df = pd.read_excel(results_file, header=None) # 读取从B列开始的每一列(索引1开始,步长2) target_columns = results_df.columns[1::2] results = results_df[target_columns] # 提前获取法律形式映射,只请求一次 legal_forms_url = "https://www.zefix.ch/ZefixREST/api/v1/legalForm.json" legal_forms_response = requests.get(legal_forms_url) legal_forms = {f["id"]: f for f in legal_forms_response.json()} search_api = "https://www.zefix.ch/ZefixREST/api/v1/firm/search.json" # 遍历每一列 for col in results.columns: # 遍历列中的每个公司名称,跳过空值 for name in results[col].dropna(): name = str(name).strip() if not name: continue payload = { "languageKey": "en", "maxEntries": 30, "name": name, "offset": 0, "searchType": "exact", } try: data = requests.post(search_api, json=payload).json() # 检查是否有搜索结果 if "list" in data and len(data["list"]) > 0: legal_form_id = data["list"][0]["legalFormId"] legal_form_name = legal_forms[legal_form_id]["name"]["en"] print(f"公司名称: {name} | 法律形式: {legal_form_name}") else: print(f"公司名称: {name} | 未找到匹配结果") except KeyError as e: print(f"公司名称: {name} | 处理出错,缺失字段: {e}") except Exception as e: print(f"公司名称: {name} | 请求或解析错误: {e}")
关键修复点
- 修正遍历逻辑:先用
for col in results.columns遍历目标列,再用results[col].dropna()遍历列中的非空公司名称,确保传入API的是真实的公司名。 - 复用法律形式数据:将法律形式列表的请求移到循环外,避免重复调用API,提升效率。
- 异常与空值处理:用
try-except捕获KeyError和其他异常,同时检查list字段是否存在且非空,避免直接访问不存在的键;跳过空的或空白的公司名称,减少无效请求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

