如何处理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)
代码说明
- 预定义字段列表:明确所有需要提取的字段,确保每条记录结构统一。
- 默认值初始化:每个呼号对应一条默认记录,保证即使字段缺失也有占位值。
- 统一处理单条记录:定位到呼号的核心数据节点后,批量处理所有字段,避免遗漏。
- 数据整洁处理:对字段值做
strip()去除空白字符,避免空字符串干扰。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

