使用Python ElementTree解析含<b>标签的XML仅获value1,如何获取完整内容?
解决xml.etree.ElementTree获取标签完整内容的问题
当你用string.text获取内容时,只能拿到<string>开始标签到第一个子标签<b>之间的文本(也就是value1 ),而子标签<b>的内容和它后面的. value3分别存在子元素的text和tail属性里,所以需要特殊处理。
方法1:使用itertext()快速拼接
itertext()方法会递归遍历当前元素及其所有子元素的文本内容,返回一个包含所有文本片段的迭代器,直接拼接即可:
import xml.etree.ElementTree as ET tree = ET.parse(xml_file) root = tree.getroot() for string in root.findall('string'): name = string.get('name') # 拼接所有文本片段 value = ''.join(string.itertext()) print(f"name: {name}, value: {value}")
运行后会输出:name: key, value: value1 value2. value3
方法2:手动遍历text、子元素text和tail
如果你需要更精细的控制(比如后续要处理标签结构),可以手动遍历元素的各个部分:
import xml.etree.ElementTree as ET tree = ET.parse(xml_file) root = tree.getroot() for string in root.findall('string'): name = string.get('name') parts = [] # 先添加当前元素的文本(如果存在) if string.text: parts.append(string.text) # 遍历所有子元素 for child in string: # 添加子元素的文本 if child.text: parts.append(child.text) # 添加子元素结束后的后续文本 if child.tail: parts.append(child.tail) value = ''.join(parts) print(f"name: {name}, value: {value}")
这个方法和itertext()效果一致,但能让你清晰看到每个文本片段的来源。
原理说明
在ElementTree的解析逻辑里:
- 元素的
text属性:当前元素开始标签到第一个子元素(或结束标签)之间的文本 - 子元素的
text属性:子元素开始标签到其内部子元素(或结束标签)之间的文本 - 子元素的
tail属性:子元素结束标签到父元素的下一个子元素(或父元素结束标签)之间的文本
所以原来的代码只取了string.text,自然会漏掉子元素的内容和后续文本。
内容的提问来源于stack exchange,提问作者Gorthez
相关产品推荐
相关产品推荐

