Python提取XML/JSON中用户rep字段值生成列表的问题
解决XML命名空间问题并提取rep字段
带命名空间XML的处理
XML命名空间是导致你提取结果为空的核心原因——直接使用<rep>或<user>标签名查找时,ElementTree会忽略带命名空间的元素,因为这些元素的实际标签是{命名空间URL}标签名格式。
假设你的XML示例如下:
9876 2024-06-01T09:00:00 4321 2024-05-30T16:45:00
修复后的XML提取代码
import xml.etree.ElementTree as ET from datetime import datetime # 替换为你XML中的实际命名空间URL NAMESPACE = {'api': 'http://your-api-namespace.com/v1'} # 如果API返回的是字符串而非文件,用ET.fromstring(xml_response)替代parse tree = ET.parse('users.xml') root = tree.getroot() # 提取rep及可选的登录日期 user_records = [] for user in root.findall('api:user', NAMESPACE): rep_value = user.find('api:rep', NAMESPACE).text login_date = user.find('api:last_login', NAMESPACE).text user_records.append({'rep': rep_value, 'last_login': login_date}) # 生成纯rep列表 rep_list = [item['rep'] for item in user_records] print(rep_list) # 输出: ['9876', '4321'] # 可选:按最后登录日期降序排序 sorted_records = sorted(user_records, key=lambda x: datetime.fromisoformat(x['last_login']), reverse=True) sorted_rep_list = [item['rep'] for item in sorted_records] print(sorted_rep_list) # 输出: ['9876', '4321']
JSON格式数据的处理
JSON无需处理命名空间,直接遍历字典提取字段即可:
假设你的JSON示例:
{ "users": [ {"rep": "9876", "last_login": "2024-06-01T09:00:00"}, {"rep": "4321", "last_login": "2024-05-30T16:45:00"} ] }
JSON提取代码
import json from datetime import datetime # 如果API返回字符串,用json.loads(json_response)替代open with open('users.json', 'r') as f: data = json.load(f) # 提取rep列表 rep_list = [user['rep'] for user in data['users']] print(rep_list) # 输出: ['9876', '4321'] # 可选:按登录日期排序 sorted_users = sorted(data['users'], key=lambda x: datetime.fromisoformat(x['last_login']), reverse=True) sorted_rep_list = [u['rep'] for u in sorted_users] print(sorted_rep_list)
关键提示
- 若XML有多个命名空间,只需在
NAMESPACE字典中添加对应的前缀和URL即可。 - 如果登录日期格式不是ISO标准,替换
datetime.fromisoformat为datetime.strptime(x['last_login'], '你的日期格式')。 - API返回的原始响应(字符串)可直接传入
ET.fromstring()或json.loads(),无需写入文件。
内容的提问来源于stack exchange,提问作者Wes Graham
相关产品推荐
相关产品推荐

