嵌套XML文件转pandas DataFrame解析问题求助
解决XML解析转pandas DataFrame的问题
嘿,我来帮你搞定这个XML转DataFrame的问题!看你给的示例XML片段,核心是要从<persName>和关联的<placeName>里提取结构化数据对吧?我给你一套直接能用的实现方案,结合Python的XML解析库和pandas来完成。
首先先补全一下你的示例XML结构(方便代码演示):
<root> <p> <persName id="t17200427-2-defend31" type="defendantName"> Alice Jones <interp inst="t17200427-2-defend31" type="surname" value="Jones"/> <interp inst="t17200427-2-defend31" type="given" value="Alice"/> <interp inst="t17200427-2-defend31" type="gender" value="female"/> </persName> , of <placeName id="t17200427-2-defloc7">St. Michael's Cornhill</placeName> </p> <!-- 可以有更多类似的被告条目 --> </root>
接下来是具体的代码实现,我会一步步解释:
import xml.etree.ElementTree as ET import pandas as pd # 1. 解析XML文件(如果是XML字符串,就用ET.fromstring(xml_str)替代) tree = ET.parse('your_defendant_file.xml') root = tree.getroot() # 2. 准备空列表存储提取的结构化数据 defendant_data = [] # 3. 遍历所有包含被告信息的<p>元素 for paragraph in root.findall('.//p'): # 定位当前段落里的<persName>节点 pers_node = paragraph.find('.//persName') if pers_node is not None: # 初始化字典存储当前被告的所有信息 current_defendant = {} # 提取<persName>自身的属性(可选,按需保留) current_defendant['person_id'] = pers_node.get('id') current_defendant['person_type'] = pers_node.get('type') # 遍历子节点<interp>,把type作为key,value作为对应值 for interp in pers_node.findall('.//interp'): interp_type = interp.get('type') current_defendant[interp_type] = interp.get('value') # 提取<persName>里的显示全名,去掉前后多余空格 current_defendant['full_name'] = pers_node.text.strip() # 提取关联的<placeName>信息 place_node = paragraph.find('.//placeName') if place_node is not None: current_defendant['place_id'] = place_node.get('id') current_defendant['location'] = place_node.text.strip() # 把当前被告的数据加入列表 defendant_data.append(current_defendant) # 4. 把列表转成pandas DataFrame df = pd.DataFrame(defendant_data) # 查看结果 print(df.head())
代码说明:
- XPath定位:用
.//p和.//persName这种相对路径,可以灵活定位到目标元素,不管XML嵌套层级如何; - 属性提取:通过
get()方法获取XML元素的属性值,比如id、type; - 文本处理:用
strip()去掉文本前后的空格,避免数据里出现多余的空白; - 扩展性:如果你的XML里还有其他字段(比如年龄、罪名),只需要在遍历的时候添加对应的提取逻辑就行。
运行这段代码后,你会得到一个包含以下列的DataFrame:person_id、person_type、surname、given、gender、full_name、place_id、location,完美对应你示例里的所有信息。
内容的提问来源于stack exchange,提问作者tinadn
相关产品推荐
相关产品推荐

