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

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'

错误原因

  1. 遍历对象错误:for name in results遍历的是DataFrame的列名,不是单元格里的公司名称,导致API用列名搜索无结果,返回的JSON没有list字段。
  2. 未处理无结果情况:即使遍历正确,若公司名称不存在、为空或API返回无匹配结果,JSON也不会有list字段,直接访问会触发KeyError。
  3. 重复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:52:10