You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python html.parser解析HTML时如何获取并使用原始标签

使用Python html.parser解析HTML时如何获取并使用原始标签

我太懂你这种需求了——用html.parser解析的时候,自己拼接标签不仅麻烦,还容易搞乱原始格式,尤其是那些不需要翻译的标签,直接用原始的多省心!我之前做类似的HTML翻译工具时也踩过这个坑,给你分享个亲测有效的解法:

核心思路就是把整个原始HTML内容存起来,在解析过程中跟踪处理位置,直接截取对应的原始标签片段,完全不用自己拼接。下面给你改好的代码,还有详细的解释:

第一步:改造你的解析器类

我们给解析器加几个关键属性:保存原始HTML内容的raw_content、跟踪处理位置的current_pos,还有用来存最终输出的output。每个回调方法里直接截取原始标签,翻译需要处理的文本:

import deepl
from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self, raw_content, deepl_client):
        super().__init__()
        self.raw_content = raw_content  # 存整个原始HTML
        self.current_pos = 0  # 跟踪当前处理到的位置
        self.deepl_client = deepl_client
        self.output = []  # 攒最终的输出内容

    def handle_starttag(self, tag, attrs):
        # 找到当前起始标签的结束位置(找第一个>)
        tag_end = self.raw_content.find('>', self.current_pos) + 1
        # 截取原始标签片段
        raw_tag = self.raw_content[self.current_pos:tag_end]
        self.output.append(raw_tag)
        # 更新处理位置到标签结束处
        self.current_pos = tag_end

    def handle_endtag(self, tag):
        # 处理结束标签,逻辑和起始标签一致
        tag_end = self.raw_content.find('>', self.current_pos) + 1
        raw_tag = self.raw_content[self.current_pos:tag_end]
        self.output.append(raw_tag)
        self.current_pos = tag_end

    def handle_data(self, data):
        # 处理需要翻译的文本内容
        data_end = self.current_pos + len(data)
        # 调用DeepL翻译,这里可以根据需求调整参数(比如正式/非正式)
        translated_text = self.deepl_client.translate_text(
            data,
            source_lang="EN",
            target_lang="FR",
            formality="formal"
        )
        self.output.append(translated_text)
        self.current_pos = data_end

    # 别忘了处理注释、DOCTYPE这类特殊内容,同样用原始片段
    def handle_comment(self, data):
        comment_end = self.raw_content.find('-->', self.current_pos) + 3
        raw_comment = self.raw_content[self.current_pos:comment_end]
        self.output.append(raw_comment)
        self.current_pos = comment_end

    def handle_decl(self, decl):
        decl_end = self.raw_content.find('>', self.current_pos) + 1
        raw_decl = self.raw_content[self.current_pos:decl_end]
        self.output.append(raw_decl)
        self.current_pos = decl_end

第二步:调整主逻辑

现在主代码里只需要把原始HTML传给解析器,最后把输出内容写入文件就行:

# 初始化DeepL客户端
auth_key = "你的DeepL密钥"
deepl_client = deepl.DeepLClient(auth_key)

# 输入输出路径
input_path = "blabla"
output_path = "blabla"

# 读取原始HTML内容
with open(input_path, 'r', encoding='utf-8') as file:
    raw_content = file.read()

# 初始化解析器,传入原始内容和DeepL客户端
parser = MyHTMLParser(raw_content, deepl_client)
parser.feed(raw_content)

# 把最终输出写入文件
with open(output_path, 'w', encoding='utf-8') as file:
    file.write(''.join(parser.output))

关键细节和注意事项

  • 这个方法完全依赖原始HTML的格式规范性,比如每个标签都以>结束,属性值里不会出现未转义的>(这种情况本身就不符合HTML规范,实际项目里几乎碰不到)。
  • 所有不需要翻译的标签直接用原始内容,完全避免了自己拼接标签可能出现的格式错误(比如属性顺序、引号类型、空格这些细节)。
  • 一定要处理所有可能的HTML内容类型,比如注释、DOCTYPE、甚至脚本标签(如果有的话,可以加handle_startendtag处理自闭合标签,handle_pi处理处理指令),不然输出会缺失部分内容。

这样改完之后,你既可以正常翻译需要处理的文本,又能直接复用原始的标签内容,不用再费心重新拼接啦!

火山引擎 最新活动