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
相关产品推荐
相关产品推荐

