如何用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 结果为:
| user | age | city |
|---|---|---|
| Alice | 30 | Paris |
| Bob | 28 | London |
内容的提问来源于stack exchange,提问作者Jay Kim
相关产品推荐
相关产品推荐

