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

如何处理API返回XML中缺失的参数以避免数据错位?

解决QRZ电台联系人数据拉取的列表错位问题

问题背景

遍历呼号列表从QRZ站点拉取火腿电台用户数据,存入多个列表后合并为DataFrame。但部分用户未填写部分字段(如邮箱、地址等),导致对应列表中没有写入"Nope"占位值,各列表长度在40-46之间波动,最终表格数据错位,无法构建准确的联系人数据库。

原代码

for element in callsignlist:
    r = requests.get(f'https://xmldata.qrz.com/xml/current/?s={key};callsign={element}')
    root = ET.fromstring(r.content)

    for elm in root.findall(".//{http://xmldata.qrz.com}call"):
        result = elm.text
        if result == "":
            callsign.append("Nope")
        else:
            callsign.append(result)
            

    for elm in root.findall(".//{http://xmldata.qrz.com}fname"):
        result = None
        result = elm.text
        if result == "":
            name.append("Nope")
        else:
            name.append(result)

问题分析

原代码的核心问题:

  • 仅当字段存在但内容为空时才添加"Nope",如果字段完全不存在于XML响应中,findall返回空列表,循环不会执行,对应列表无新增值,导致各列表长度不一致。
  • 每个字段单独循环处理,没有保证每个呼号对应的所有字段都有一个占位值,最终数据对应关系混乱。

解决方案

换用「单条记录初始化默认值+字段覆盖」的思路:对每个呼号先创建包含所有字段的默认记录(值为"Nope"),再从XML中提取存在的字段值覆盖默认值,最后将完整记录存入列表,确保所有记录结构一致,避免错位。

修改后的代码

import requests
import xml.etree.ElementTree as ET
import pandas as pd

# 定义需要提取的字段,按需添加更多字段
fields = ["call", "fname", "email", "addr1", "addr2", "country", "qslmgr"]
# 定义XML命名空间映射,简化XPath查询
namespace = {"qrz": "http://xmldata.qrz.com"}
records = []

for element in callsignlist:
    # 初始化单条记录,所有字段默认值为"Nope"
    record = {field: "Nope" for field in fields}
    # 请求数据
    r = requests.get(f'https://xmldata.qrz.com/xml/current/?s={key};callsign={element}')
    root = ET.fromstring(r.content)
    
    # 定位当前呼号的核心数据节点
    callsign_node = root.find(".//qrz:Callsign", namespaces=namespace)
    if callsign_node is not None:
        # 遍历字段,覆盖默认值(仅当字段存在且内容非空时)
        for field in fields:
            field_node = callsign_node.find(f"qrz:{field}", namespaces=namespace)
            if field_node is not None and field_node.text is not None and field_node.text.strip() != "":
                record[field] = field_node.text.strip()
    
    # 将完整记录加入列表
    records.append(record)

# 转换为DataFrame
df = pd.DataFrame(records)
print(df)

代码说明

  1. 预定义字段列表:明确所有需要提取的字段,确保每条记录结构统一。
  2. 默认值初始化:每个呼号对应一条默认记录,保证即使字段缺失也有占位值。
  3. 统一处理单条记录:定位到呼号的核心数据节点后,批量处理所有字段,避免遗漏。
  4. 数据整洁处理:对字段值做strip()去除空白字符,避免空字符串干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:30:52