lxml提取含序列化标签的<seg>元素内容时返回None的解决方法
提取含子标签的元素内部内容的解决方案
问题原因
当<seg>元素包含<bpt>、<ept>这类子标签时,ElementTree的.text属性仅返回当前元素第一个子元素之前的文本。你的示例中<seg>的第一个子元素是<bpt>,因此.text返回None。
解决方法
方法1:序列化后剥离外层标签
直接序列化<seg>元素,再通过字符串处理去掉外层的<seg>和</seg>标签:
import xml.etree.ElementTree as ET # 解析XML并定位到目标seg元素 tree = ET.parse(file) seg_elem = tree.getroot().find('body').findall('tu')[0].findall('tuv')[0].find('seg') # 序列化seg元素为Unicode字符串 seg_full_xml = ET.tostring(seg_elem, encoding='unicode') # 剥离外层标签并清理多余空白 source_segment = seg_full_xml.replace('<seg>', '').replace('</seg>', '').strip()
方法2:遍历子节点拼接内容
更健壮的方式是遍历<seg>的所有子节点,拼接文本和子元素的序列化内容,避免字符串替换的局限性:
import xml.etree.ElementTree as ET def extract_seg_content(seg_elem): content_parts = [] # 添加seg元素开头的文本(如果存在) if seg_elem.text: content_parts.append(seg_elem.text) # 遍历所有子元素 for child in seg_elem: # 序列化子元素并加入内容列表 content_parts.append(ET.tostring(child, encoding='unicode')) # 添加子元素之后的文本(如果存在) if child.tail: content_parts.append(child.tail) # 拼接所有部分并清理空白 return ''.join(content_parts).strip() # 解析XML并提取内容 tree = ET.parse(file) seg_elem = tree.getroot().find('body').findall('tu')[0].findall('tuv')[0].find('seg') source_segment = extract_seg_content(seg_elem)
方案对比
- 方法1:实现简单、性能较高,适合
<seg>标签无属性且内部不会出现<seg>字符串的场景。 - 方法2:通用性更强,能处理任意混合文本与子标签的
<seg>元素,避免字符串替换可能引发的错误。
内容的提问来源于stack exchange,提问作者wilkas
相关产品推荐
相关产品推荐

