如何用Beautiful Soup解析XML为Pandas DataFrame并批量生成子节点DataFrame
动态生成XML子节点对应的Pandas DataFrame
原始数据与初始化代码
import pandas as pd from bs4 import BeautifulSoup xml_data = """<address_details sequence_number="1" match_indicator="L"> <address_input id="ADI" address_details="street address and postcode" /> <address_matched id="ADO" address_key="123" house_name="" house_number="" street_1="" street_2="" district="" posttown="" county="" postcode="AB1 2CD" address_type="" /> <electoral_roll id="ELR" name_match_indicator="A" title="" forename="firstName" second_name="J" surname="LastName" date_of_birth="" period="19-21" junior_senior="" /> <electoral_roll id="ELR" name_match_indicator="C" title="" forename="FirstName" second_name="M" surname="MILES" date_of_birth="" period="19-21" junior_senior="" /> <telephone_data id="TLR" title="" forename="D" second_name="" surname="LastName" date_of_birth="" std_code="******" local_number="*****" tps="" date_loaded="2020-02-07" LineType="N" /> <insight id="INR" name_match_indicator="A" title="MR" forename="firstName" second_name="J" surname="LastName" date_of_birth="YYYY-MM-DD" /> <coded_insight_for_id_verification id="IDC" number_of_accounts="6" /> </address_details>""" soup = BeautifulSoup(xml_data, "html.parser")
当前实现的问题
现有代码通过手动指定每个子节点标签名生成DataFrame,存在两个明显缺陷:
- 子节点类型增减时(比如新增
new_category或缺失electoral_roll),需要手动修改代码添加或删除对应逻辑 - 无法自动适配所有子节点类型,扩展性差
优化方案:动态遍历生成
通过自动识别所有子节点标签名,批量生成对应DataFrame,代码如下:
# 获取address_details下所有子节点的标签名,去重后得到所有节点类型 child_tag_types = set( child.name for child in soup.find("address_details").children if child.name is not None # 过滤掉换行等非标签节点 ) # 用字典存储每个标签类型对应的DataFrame,方便后续按标签名调用 tag_to_df = {} for tag in child_tag_types: # 找到该标签下的所有节点 node_list = soup.find_all(tag) # 提取每个节点的属性字典,转为DataFrame tag_to_df[tag] = pd.DataFrame([node.attrs for node in node_list]) # 示例:查看electoral_roll对应的DataFrame print(tag_to_df["electoral_roll"]) # 若要单独输出某个类型的DataFrame,直接调用字典即可,比如: # tag_to_df["address_matched"] # tag_to_df["telephone_data"]
方案优势
- 自动适配:无需手动指定标签名,自动识别所有子节点类型
- 扩展性强:子节点类型增减时无需修改代码,自动兼容
- 便捷访问:用字典存储,可通过标签名快速获取对应DataFrame
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

