最常用且可靠的方式是用xml.etree.ElementTree或lxml,核心是遍历元素并递归收集.text和.tail属性值,注意判空、去空白及编码处理。

Python中提取XML所有文本内容,最常用且可靠的方式是用xml.etree.ElementTree(标准库)或第三方库lxml。核心思路是:遍历所有元素,获取其.text和.tail属性,并递归处理子元素。
使用ElementTree提取全部文本(推荐初学者)
ElementTree无需安装,适合简单到中等复杂度的XML。注意它默认不保留空白文本,若需完整文本(含换行缩进),建议用xml.etree.ElementTree.XMLParser配合strip_cdata=False,但更关键的是要同时收集text和tail:
-
element.text:元素开始标签与第一个子元素(或结束标签)之间的文本 -
element.tail:元素结束标签与下一个兄弟元素开始标签之间的文本(常被忽略!) - 递归遍历时,对每个元素先加
text,再递归子元素,最后加tail
代码示例:安全提取全部可见文本
以下函数会返回去除首尾空白、跳过纯空白节点后的所有文本片段(保留自然断句):
import xml.etree.ElementTree as ETdef extract_all_text(root): texts = []
def walk(elem): if elem.text and elem.text.strip(): texts.append(elem.text.strip()) for child in elem: walk(child) if elem.tail and elem.tail.strip(): texts.append(elem.tail.strip()) walk(root) return texts使用示例
xml_str = """
""" root = ET.fromstring(xml_str) print(extract_all_text(root)) Python教程 第一段内容。
立即学习“Python免费学习笔记(深入)”;
第二段内容。
输出:['Python教程', '第一段内容。', '第二段内容。']
需要保留格式或处理HTML混入时用lxml
若XML含命名空间、CDATA、注释,或你想更精准控制(比如只取“可见文本”,跳过注释/处理指令),
lxml更强大:
- 安装:
pip install lxml - 用
etree.tostring(elem, method='text', encoding='unicode')可一键提取某元素内所有文本(含子元素),但会合并空格 - 更精细控制可用
itertext()方法:''.join(elem.itertext())返回该元素及其后代的所有文本内容(不含标签)
注意事项与常见坑
提取“所有文本”不等于“所有字符串”。需注意:
- XML注释(
)、处理指令、DTD声明默认不被ElementTree解析,lxml可通过设置解析器参数捕获 -
text和tail可能为None,务必判空再调.strip() - 如果XML编码不是UTF-8,解析前需显式指定(如
ET.fromstring(xml_bytes, parser=ET.XMLParser(encoding='gbk'))) - 想获得带换行/缩进的原始文本?需用
minidom或lxml的pretty_print=False配合手动遍历,但通常不必要










