如何使用Python提取XML中所有节点文本及节点间符号等全部元素
问题原因分析
你原有代码丢失元素的核心原因有两个:
- 仅处理了没有子元素的叶子节点的
text属性,忽略了有子元素的父节点本身携带的文本(比如<init>标签的文本是=,因为它包含<expr>子元素,原有逻辑直接跳过了该层的文本提取) - 完全没有处理XML元素的
tail属性:XML语法中,元素结束标签后紧跟的非子元素文本会存在tail属性中,比如<decl></decl>:里的冒号、<parameter></parameter>}里的右花括号都属于tail内容,原有逻辑完全没提取这部分内容
修正后代码
import xml.etree.ElementTree as ET # 注册命名空间避免标签自动携带前缀,不影响文本提取可按需保留 ET.register_namespace('', 'http://www.example.org/domain/src') xml = ET.parse('1.xml') root = xml.getroot() def split_text(text): """将文本按空白切割,过滤空字符串,返回拆分后的独立元素列表""" if not text: return [] return [item.strip() for item in text.split() if item.strip()] def getDataRecursive(element): data = list() # 提取当前元素的文本内容 data.extend(split_text(element.text)) # 递归处理所有子元素 for child in element: data.extend(getDataRecursive(child)) # 提取当前元素结束标签后的尾部文本 data.extend(split_text(element.tail)) return data # 打印结果 for x in getDataRecursive(root): print(x)
代码修改说明
- 移除了叶子节点判断逻辑,所有元素的
text都会被提取 - 新增
tail属性提取逻辑,补全了元素结束标签后的遗漏内容 - 新增文本拆分逻辑,自动把空格分隔的关键字、符号拆分为独立列表元素,同时过滤掉换行、缩进等无效空白
内容的提问来源于stack exchange,提问作者AKMalkadi
相关产品推荐
相关产品推荐

