使用Python BeautifulSoup解析HTML替换文本时的翻译问题求助
问题描述
我有如下HTML标签结构:
<p class="" id=""> Hi, My name is Vinay Kesharwani & I am the Founder of <a class="" href="https://scriptmint.com" rel="noopener ugc nofollow" target="_blank">ScriptMint</a> . I am a Full Stack Developer working with Laravel, Vue.js & Tailwind CSS. </p>
需要在不破坏标签结构的前提下,翻译整个内容(包括嵌套标签中的文本)。
我编写了递归函数处理标签翻译,但仅<a>标签内容被翻译,其余文本未处理:
def translate_tag(tag): if tag.string: trans_text = translator.translate( tag.string ) tag.string = trans_text else: for child in tag: if child.name: translate_tag(child)
错误输出结果:
<p class="" id="">Hi, My name is Vinay Kesharwani & I am the Founder of <a class="af np" href="https://scriptmint.com" rel="noopener ugc nofollow" target="_blank">スクリプトミント</a> . I am a Full Stack Developer working with Laravel, Vue.js & Tailwind CSS. </p>
修复方案
问题根源
原函数仅处理两种场景:
- 标签拥有
string属性(纯文本节点或单一文本内容的标签) - 标签包含带
name属性的子元素节点
但<p>标签的内容是文本节点+元素节点+文本节点的混合结构,原函数跳过了<p>下的独立文本节点(这类节点无name属性),导致只有<a>标签内的文本被翻译。
修复后的代码
def translate_tag(tag): # 遍历标签下所有子节点,涵盖文本节点与元素节点 for child in tag.contents: # 处理文本节点:无name属性的节点 if not hasattr(child, 'name'): # 跳过空文本节点(如换行、空格) if child.strip(): trans_text = translator.translate(child) child.replace_with(trans_text) # 处理元素节点:递归翻译内部内容 else: translate_tag(child)
关键说明
- 使用
tag.contents替代原遍历方式,确保所有子节点(文本、元素)都被处理 - 通过
hasattr(child, 'name')区分节点类型:- 文本节点直接翻译非空内容,并用翻译结果替换原节点
- 元素节点递归调用函数处理其内部结构
- 增加
child.strip()判断,避免对空白文本节点发起无效翻译请求
预期效果
修复后,<p>标签内的所有文本及<a>标签文本都会被翻译,示例输出(以日语翻译为例):
<p class="" id="">こんにちは、私の名前はビナイ・ケシャルワーニーです。<br> <a class="af np" href="https://scriptmint.com" rel="noopener ugc nofollow" target="_blank">スクリプトミント</a> の創設者です。私はLaravel、Vue.js、Tailwind CSSを使って開発するフルスタック開発者です。</p>
内容的提问来源于stack exchange,提问作者Maksim Smolovsky
相关产品推荐
相关产品推荐

