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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:11:07