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

Python解析多级XML/JSON并转DataFrame技术求助

多级XML/JSON转Python DataFrame完整解析方案

一、XML解析方案

你遇到的b'<xml_string>'是因为requests.get返回的content是字节流,只需解码为字符串即可处理。另外该XML包含命名空间,必须处理才能正确提取多级节点数据。

完整代码

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

# 获取XML数据并解码
url = "https://directory.spineservices.nhs.uk/ORD/2-0-0/organisations/REN?_format=xml"
response = requests.get(url)
xml_str = response.content.decode('utf-8')  # 解码字节流为字符串

# 解析XML,处理命名空间
root = ET.fromstring(xml_str)
ns = {
    'ns': 'http://spineservices.nhs.uk/ORD/2-0-0/organisation',
    'xsi': 'http://www.w3.org/2001/XMLSchema-instance'
}

# 提取多级数据,整理为字典列表
org_data = []
for org in root.findall('ns:organisation', ns):
    org_dict = {
        'org_id': org.find('ns:organisationId/ns:value', ns).text,
        'name': org.find('ns:name', ns).text,
        'status': org.find('ns:status/ns:value', ns).text,
        # 提取嵌套的地址信息
        'address_line1': org.find('ns:address/ns:addressLine1', ns).text,
        'address_line2': org.find('ns:address/ns:addressLine2', ns).text,
        'town': org.find('ns:address/ns:town', ns).text,
        'postcode': org.find('ns:address/ns:postcode', ns).text,
        # 提取联系信息
        'phone': org.find('ns:contact/ns:telephone/ns:value', ns).text if org.find('ns:contact/ns:telephone/ns:value', ns) is not None else None,
        'email': org.find('ns:contact/ns:email/ns:value', ns).text if org.find('ns:contact/ns:email/ns:value', ns) is not None else None
    }
    org_data.append(org_dict)

# 转换为DataFrame
df_xml = pd.DataFrame(org_data)
print(df_xml.head())

关键说明

  • 用response.content.decode('utf-8')将字节流转为可解析的XML字符串
  • 通过命名空间字典ns定位节点,避免因命名空间导致的节点查找失败
  • 递归提取嵌套字段,对可能为空的字段添加None判断,保证DataFrame结构完整

二、JSON解析方案

直接转置DataFrame无法处理嵌套JSON结构,使用pandas.json_normalize可以自动扁平化多级嵌套数据,是处理这类场景的最优方案。

完整代码

import requests
import pandas as pd

# 获取JSON数据
url = "https://directory.spineservices.nhs.uk/ORD/2-0-0/organisations/REN?_format=json"
response = requests.get(url)
data = response.json()

# 扁平化嵌套JSON,指定要展开的层级
df_json = pd.json_normalize(
    data['organisation'],
    sep='_',  # 嵌套字段用下划线连接,避免列名冲突
    # 可根据需求指定需要提取的嵌套字段路径
    record_path=None,
    meta=[
        'organisationId.value',
        'name',
        'status.value',
        ['address', 'addressLine1'],
        ['address', 'addressLine2'],
        ['address', 'town'],
        ['address', 'postcode'],
        ['contact', 'telephone', 'value'],
        ['contact', 'email', 'value']
    ]
)

# 重命名列名(可选)
df_json.columns = [
    'org_id', 'name', 'status', 'address_line1', 'address_line2',
    'town', 'postcode', 'phone', 'email'
]

print(df_json.head())

关键说明

  • pd.json_normalize自动处理嵌套结构,无需手动递归扁平化
  • 通过sep参数定义嵌套字段的连接符,让列名更清晰
  • 用meta参数指定需要提取的多级字段路径,精准控制输出内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:40:32