手把手教你用 Python 脚本调用 DeepL API Pro 进电子书的行进行中英文自动翻译

开发 后端
html 文件整理起来比较麻烦,一个比较方便的手段是使用 BeautifulSoup 模块。BeautifulSoup 本来是爬虫工具,但,它又很方便的手段可以清理 html 文件。

[[439869]]

大家好,我是我是Python进阶者。

一、前言

前几天有个叫【张茜】的粉丝找我看了一个代码,关于电子书中英文自动翻译的,感觉挺有意思,这里拿出来给大家分享下。

二、简介

这个小项目是git上一个叫【xiaolai】的大佬分享的,看上去还是挺新的,发布不太久,14天前发布的。

一本书中文译文大约 39 万字的书,差不多用 1.5 小时就可以处理完毕(包括基本的格式编辑),这速度恐怖如斯!下面一起来看看这款神器的使用方法吧!

三、电子书格式转换路径

首先,需要将电子书从 Kindle 中导出来,并用 ePubor 进行 deDRM,而后将电子书转换成 epub 文件。

我都是在 Amazon 上直接买,而后在电脑上安装一个老版本的 Kindle App,用鼠标右键点击书名,下载,并不打开该电子书,而后退出 Kindle。

ePubor Ultimate 也是个收费软件,能把旧版 Kindle 下载的电子书的 DRM 去掉;将 awz 文件转换成 epub 文件。(可参考这个网页)

然后,再用免费软件 Calibre 将 epub 转换成 htmlz 文件(一个压缩包)。(我尝试过使用命令行工具包 pandoc,但,比较之后,发现 Calibre 在保留样式方面可能更好一点……)

在 Terminal 里用 unzip 命令解开 htmlz 压缩包。

四、选择 html 格式作为翻译格式的原因

可以保留书中大量的脚注、尾注及其链接;DeepL 有专门的 API 参数处理 xml tag,tag_handling="xml";

可以通过 css 文件随意设置显示样式,比较灵活;

可以通过插入 javascript 函数指定某种特定语言的显示(比如,只显示中文);

可以用来作为源文件转换成任意格式的电子书……

另外,在调用 tag_handling="xml" 之后,DeepL API 返回的译文非常规整,能够保留所有 html tag;并且,“返回字符串” 与 “原字符串” 相同,可以作为一个判断依据 —— 该行有没有被翻译,如果没有,在生成的译文 html 文件中,该行没必要重复出现……

五、清理 html

html 文件整理起来比较麻烦,一个比较方便的手段是使用 BeautifulSoup 模块。BeautifulSoup 本来是爬虫工具,但,它又很方便的手段可以清理 html 文件。

以下脚本主要完成以下工作:

首先将 html 文件里的所有 \n 去掉;将所有

单独放在一行;将所有

也单独放在一行;将

内部的所有 \n 全都去掉;并在之前加上一个空行;…… 当然,你可以在这里做更多你自己喜欢做的格式清理。为了方便起见,path 和 source_filename 以及 target_filename 都单独指定。代码如下:

  1. import bs4 
  2. import re 
  3.  
  4. path = "John Law/" # 文件夹名称末尾得有 / 
  5. source_filename = "index.html" 
  6. target_filename = "index2.html" 
  7.  
  8. html = open(path+source_filename) 
  9. htmltext = html.read() 
  10.  
  11. soup = bs4.BeautifulSoup(htmltext) 
  12.  
  13. # 将所有的 \n 去掉…… 
  14. htmltext = str(bs4.BeautifulSoup(htmltext)).replace("\n"""
  15.  
  16. # <h... 之前添加空行 
  17. pttn = r'<h' 
  18. rpl = r'\n\n<h' 
  19. re.findall(pttn, htmltext) 
  20. htmltext = re.sub(pttn, rpl, htmltext) 
  21.  
  22. # <div... 之前添加空行 
  23. pttn = r'<div' 
  24. rpl = r'\n\n<div' 
  25. re.findall(pttn, htmltext) 
  26. htmltext = re.sub(pttn, rpl, htmltext) 
  27.  
  28. # </div> 之前添加空行 
  29. pttn = r'</div>' 
  30. rpl = r'\n\n</div>' 
  31. re.findall(pttn, htmltext) 
  32. htmltext = re.sub(pttn, rpl, htmltext) 
  33.  
  34. # <p... 之前添加空行 
  35. pttn = r'<p' 
  36. rpl = r'\n\n<p' 
  37. re.findall(pttn, htmltext) 
  38. htmltext = re.sub(pttn, rpl, htmltext) 
  39.  
  40. fileSave = open(path+target_filename, "w"
  41. fileSave.write(htmltext) 
  42. print(htmltext) 

六、逐行提交 DeepL API Pro 进行翻译

将清理过的 html 交给以下脚本,逐行提交给 DeepL 翻译,并返回。

为了方便起见,path 和 source_filename 以及 target_filename 都单独指定。

lines 是 source_filename 的内容 new_lines 是将要放到 target_filename 中的内容 startline 是 “从哪一行开始提交 DeepL 翻译” endline 是 “到哪一行开始结束提交 DeepL 翻译”。代码如下:

  1. import re 
  2. import requests 
  3.  
  4. auth_key = "<your DeepL API Pro authentication key>" # 注意,要订阅的是 DeepL API Pro 
  5. target_language = "ZH"  ## 当然,你可以将目标语言设置成任何 DeepL 支持的语言 
  6.  
  7. path = "John Law/" # 文件夹名称末尾得有 / 
  8. source_filename = "index2.html" # 上一步生成的文件,成为这一步的 “源文件” 
  9. target_filename = "index3.html" 
  10.  
  11. def translate(text): 
  12.     result = requests.get(  
  13.        "https://api.deepl.com/v2/translate"
  14.        params={  
  15.          "auth_key": auth_key, 
  16.          "target_lang": target_language, 
  17.          "text": text, 
  18.          "tag_handling""xml", # 这个参数确保 DeepL 正确处理 html tags 
  19.        }, 
  20.     )  
  21.     return result.json()["translations"][0]["text"
  22.  
  23. def add_language_tag_en(html): 
  24.     pttn = re.compile(r'^<(.*?) class="(.*?)">', re.M) 
  25.     rpl = r'<\1 class="\2 en">' 
  26.     re.findall(pttn, html) 
  27.     html = re.sub(pttn, rpl, html) 
  28.     return html 
  29.  
  30. def add_language_tag_cn(html): 
  31.     pttn = re.compile(r'^<(.*?) class="(.*?)">', re.M) 
  32.     rpl = r'<\1 class="\2 cn">' 
  33.     re.findall(pttn, html) 
  34.     html = re.sub(pttn, rpl, html) 
  35.     return html 
  36.  
  37. lines = open(path+source_filename, "r").readlines() 
  38.  
  39.  
  40. new_lines = [] 
  41. line_count = 0 
  42. startline = 16 
  43. endline = 4032 
  44.  
  45. for line in lines: 
  46.     line_count += 1 
  47.     if line_count < startline or line_count > endline or line.strip() == ''
  48.         new_lines.append(line) 
  49.         print(line) 
  50.         continue         
  51.      
  52.     succeeded = False 
  53.     while not succeeded: 
  54.         # 以下比较粗暴的 try... except,用来防止执行过程中出现 DeepL 连接错误而导致翻译任务中断…… 
  55.         try: 
  56.             line_translated = translate(line) 
  57.             # 以下一行确保将返回的字符串转换成一整行,而非含有 \n 的多行文本 
  58.             line_translated = line_translated.replace("\n"""
  59.              
  60.             succeeded = True 
  61.         except
  62.             succeeded = False 
  63.      
  64.     if line.strip() == line_translated.strip():  
  65.         #返回的字符串与原字符串相同,说明 html tag 之间的内容无需翻译 
  66.         new_lines.append(line) 
  67.         print(line) 
  68.     else
  69.         line = add_language_tag_en(line) 
  70.         line_translated = add_language_tag_cn(line_translated) 
  71.         new_lines.append(line) 
  72.         print(line) 
  73.         new_lines.append(line_translated) 
  74.         print(line_translated) 
  75.  
  76. with open(path+target_filename, 'w'as f: 
  77.     f.write("\n".join(new_lines)) 

七、结果展示

1、运行代码之后,会自动读取待翻译的文件,然后进行翻译,如下图所示:

2、运行完程序之后,可以得到想要的结果,如下图所示:

八、总结

大家好,我是Python进阶者。这篇文章主要给大家介绍了使用Python脚本调用DeepL API Pro进电子书的行中英文自动翻译的方法,代码亲测可行,欢迎大家积极尝试,下次再遇到需要自动翻译的时候,不妨调用下这个API,兴许事半功倍呢!

 

责任编辑:武晓燕 来源: Python爬虫与数据挖掘
相关推荐

2022-08-04 10:39:23

Jenkins集成CD

2021-08-09 13:31:25

PythonExcel代码

2022-10-19 14:30:59

2021-03-02 09:05:13

Python

2021-12-11 20:20:19

Python算法线性

2021-02-02 13:31:35

Pycharm系统技巧Python

2020-11-08 14:13:31

Python帕累托分析开发

2021-05-10 06:48:11

Python腾讯招聘

2021-02-06 14:55:05

大数据pandas数据分析

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2020-12-17 09:40:01

Matplotlib数据可视化命令

2021-05-17 21:30:06

Python求均值中值

2021-02-10 09:34:40

Python文件的压缩PyCharm

2009-04-22 09:17:19

LINQSQL基础

2021-03-23 09:05:52

PythonExcelVlookup

2021-08-02 23:15:20

Pandas数据采集

2012-01-11 13:40:35

移动应用云服务

2020-03-08 22:06:16

Python数据IP

2021-01-21 09:10:29

ECharts柱状图大数据
点赞
收藏

51CTO技术栈公众号