使用BeautifulSoup与googletrans翻译XLIFF文件时的内嵌标签处理难题
处理XLIFF内嵌标签的翻译方案 & 工具推荐
一、用BeautifulSoup保留标签结构翻译文本
你遇到的核心问题是如何保留<x>这类内嵌标签的结构,只翻译其中的文本内容——其实不用重新构建标签,直接遍历source的子节点,区分文本和标签处理就行:
- 遍历子节点,针对性处理:BeautifulSoup会把标签下的文本(
NavigableString)和元素(Tag)分开存储,你可以逐个检查每个子节点:- 如果是文本节点,直接翻译替换内容;
- 如果是
<x>标签,直接复制原标签到target中,完全保留它的属性和位置。
举个具体的代码示例:
from bs4 import BeautifulSoup, NavigableString from googletrans import Translator translator = Translator() # 假设你已经读取了XLIFF文件内容到xliff_content变量 soup = BeautifulSoup(xliff_content, 'xml') for trans_unit in soup.find_all('trans-unit'): source_tag = trans_unit.find('source') # 创建新的target标签 target_tag = soup.new_tag('target') for child in source_tag.children: if isinstance(child, NavigableString): # 翻译文本,注意保留原有的空白(如果需要的话) original_text = child.string.strip() if child.string.strip() else child.string translated_text = translator.translate(original_text, dest='pl').text target_tag.append(translated_text) else: # 复制原有的<x>标签(包括所有属性)到target target_tag.append(child.copy()) # 将生成的target标签添加到trans-unit中 trans_unit.append(target_tag) # 最后保存修改后的XLIFF内容 with open('translated.xliff', 'w', encoding='utf-8') as f: f.write(str(soup))
这个方法不管文本和<x>标签的顺序如何,都能准确保留结构,只替换文本内容,完全符合你的需求。
二、更适合处理XLIFF的工具包
如果经常处理XLIFF文件,专门的工具包会比BeautifulSoup更高效、更贴合场景:
- xliff:专门为XLIFF格式设计的Python库,支持1.2和2.0版本,能直接定位
trans-unit、source、target,处理内嵌标记也更便捷,不用手动遍历节点。 - lxml:作为高性能XML处理库,用它来解析XLIFF会比BeautifulSoup更快(尤其是大文件),配合XPath可以精准定位节点,处理内嵌标签的逻辑也更灵活。
- DeepL Python Client:如果翻译质量和稳定性更重要,DeepL的翻译API比googletrans更可靠,而且它本身支持处理带标签的文本(比如保留HTML/XML标签结构),不用自己写标签处理逻辑。
另外,googletrans现在存在API不稳定、限制较多的问题,长期使用建议替换成更稳定的翻译服务。
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

