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

如何用read_xml()与XPath从XML提取DataFrame并获取result节点值

解决 pd.read_xml 解析 XML 返回全 NaN 的问题

问题原因

你当前的代码选中了 <result> 节点,但 pd.read_xml 默认提取所选元素的文本内容,而 <result> 本身没有文本,仅包含子节点,且目标数值存储在子节点的 value 属性中,因此返回全 NaN。

正确解析方法

方法一:使用 lxml 手动提取属性值

这种方法灵活性强,能精准获取子节点的 value 属性:

from lxml import etree
import pandas as pd
from io import StringIO

# 解析 XML 内容
tree = etree.parse(StringIO(r.text))
# 定位所有 <result> 节点(兼容带命名空间的情况)
result_nodes = tree.xpath('//*[local-name()="result"]')

# 遍历每个 result 节点,提取子节点的属性值
data_list = []
for node in result_nodes:
    row_dict = {}
    for child in node:
        # 获取子节点的本地名称(避免命名空间干扰)
        tag_name = etree.QName(child).localname
        # 提取 value 属性值
        row_dict[tag_name] = child.get('value')
    data_list.append(row_dict)

# 转换为 DataFrame
df = pd.DataFrame(data_list)

方法二:调整 pd.read_xml 参数(适用于无命名空间场景)

如果 XML 没有命名空间,可直接定位子节点并提取属性,但需注意结构重构:

import pandas as pd
from io import StringIO

# 选中所有 result 下的子节点,提取 value 属性
temp_df = pd.read_xml(
    StringIO(r.text),
    xpath='//result/*',
    attrs=['value'],
    names=['value']
)
# 按 result 分组重构为目标结构
df = temp_df.groupby(temp_df.index // len(temp_df) // 2)['value'].unstack()

示例验证

假设你的 XML 结构如下:

<root>
  <result>
    <user value="Alice"/>
    <age value="30"/>
    <city value="Paris"/>
  </result>
  <result>
    <user value="Bob"/>
    <age value="28"/>
    <city value="London"/>
  </result>
</root>

使用方法一解析后,DataFrame 结果为:

useragecity
Alice30Paris
Bob28London

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:13:40