Python BeautifulSoup兼容解析两种异构XML提取活性/非活性元素
基于BeautifulSoup的两类异构XML统一解析方案
核心实现思路是把两种完全不同的标记规则做一层抽象适配,不绑定单一XML结构,遍历节点时按统一规则判断命中类型,最后输出标准化的提取结果,完全兼容深度嵌套场景。
匹配规则抽象
两类结构的命中逻辑做合并处理,满足任意一条规则即可判定为对应类型的元素:
- 活性元素
- 标签名为
activeelementSubstance - 标签名为
element且classCode属性值为ACTIM
- 标签名为
- 非活性元素
- 标签名为
inactiveelementSubstance - 标签名为
element且classCode属性值为IACT
- 标签名为
可直接运行的统一解析代码
from bs4 import BeautifulSoup def parse_ingredient_xml(xml_text: str) -> dict: """ 兼容两类异构XML,提取所有活性/非活性元素的名称与code编码 返回格式: { "active": [{"name": "元素名", "code": "编码值"}, ...], "inactive": [{"name": "元素名", "code": "编码值"}, ...] } """ soup = BeautifulSoup(xml_text, "xml.parser") parse_result = {"active": [], "inactive": []} # 遍历所有节点,不限制嵌套深度 for node in soup.find_all(): # 活性元素判定 active_match = ( node.name == "activeelementSubstance" or (node.name == "element" and node.get("classCode") == "ACTIM") ) # 非活性元素判定 inactive_match = ( node.name == "inactiveelementSubstance" or (node.name == "element" and node.get("classCode") == "IACT") ) if not active_match and not inactive_match: continue # 提取字段:如果你的XML内部名称/code标签名和默认值不一致,直接修改下面find的参数即可 name_node = node.find(["name", "substanceName", "displayName"]) code_node = node.find("code") ingredient_item = { "name": name_node.get_text(strip=True) if name_node else "", "code": code_node.get("code", "") if code_node else "" } if active_match: parse_result["active"].append(ingredient_item) else: parse_result["inactive"].append(ingredient_item) return parse_result
方案适配说明
- 不依赖固定XML层级,不管节点嵌套多深都能正常命中,不会出现漏提取的问题
- 规则扩展成本极低,如果后续新增其他标记规则的同类型XML,只需要在
active_match/inactive_match的判断条件里追加对应规则即可,不需要重构整体解析逻辑 - 解决了常规标签别名映射方案无法适配“独立标签标记/属性标记”两种完全异构结构的问题
- 字段提取部分预留了常见标签兼容,可根据实际XML的内部字段命名快速调整
内容的提问来源于stack exchange,提问作者Jose R
相关产品推荐
相关产品推荐

