点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

洛阳亲友如相问,一片冰心在玉壶。

大家好,我是我是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 全都去掉;并在之前加上一个空行;…… 当然,你可以在这里做更多你自己喜欢做的格式清理。为了方便起见,pathsource_filename 以及 target_filename 都单独指定。代码如下:

import bs4
import repath = "John Law/" # 文件夹名称末尾得有 /
source_filename = "index.html"
target_filename = "index2.html"html = open(path+source_filename)
htmltext = html.read()soup = bs4.BeautifulSoup(htmltext)# 将所有的 \n 去掉……
htmltext = str(bs4.BeautifulSoup(htmltext)).replace("\n", "")# <h... 之前添加空行
pttn = r'<h'
rpl = r'\n\n<h'
re.findall(pttn, htmltext)
htmltext = re.sub(pttn, rpl, htmltext)# <div... 之前添加空行
pttn = r'<div'
rpl = r'\n\n<div'
re.findall(pttn, htmltext)
htmltext = re.sub(pttn, rpl, htmltext)# </div> 之前添加空行
pttn = r'</div>'
rpl = r'\n\n</div>'
re.findall(pttn, htmltext)
htmltext = re.sub(pttn, rpl, htmltext)# <p... 之前添加空行
pttn = r'<p'
rpl = r'\n\n<p'
re.findall(pttn, htmltext)
htmltext = re.sub(pttn, rpl, htmltext)fileSave = open(path+target_filename, "w")
fileSave.write(htmltext)
print(htmltext)

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

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

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

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

import re
import requestsauth_key = "<your DeepL API Pro authentication key>" # 注意,要订阅的是 DeepL API Pro
target_language = "ZH"  ## 当然,你可以将目标语言设置成任何 DeepL 支持的语言path = "John Law/" # 文件夹名称末尾得有 /
source_filename = "index2.html" # 上一步生成的文件,成为这一步的 “源文件”
target_filename = "index3.html"def translate(text):result = requests.get( "https://api.deepl.com/v2/translate",params={ "auth_key": auth_key,"target_lang": target_language,"text": text,"tag_handling": "xml", # 这个参数确保 DeepL 正确处理 html tags},) return result.json()["translations"][0]["text"]def add_language_tag_en(html):pttn = re.compile(r'^<(.*?) class="(.*?)">', re.M)rpl = r'<\1 class="\2 en">'re.findall(pttn, html)html = re.sub(pttn, rpl, html)return htmldef add_language_tag_cn(html):pttn = re.compile(r'^<(.*?) class="(.*?)">', re.M)rpl = r'<\1 class="\2 cn">'re.findall(pttn, html)html = re.sub(pttn, rpl, html)return htmllines = open(path+source_filename, "r").readlines()new_lines = []
line_count = 0
startline = 16
endline = 4032for line in lines:line_count += 1if line_count < startline or line_count > endline or line.strip() == '':new_lines.append(line)print(line)continue        succeeded = Falsewhile not succeeded:# 以下比较粗暴的 try... except,用来防止执行过程中出现 DeepL 连接错误而导致翻译任务中断……try:line_translated = translate(line)# 以下一行确保将返回的字符串转换成一整行,而非含有 \n 的多行文本line_translated = line_translated.replace("\n", "")succeeded = Trueexcept:succeeded = Falseif line.strip() == line_translated.strip(): #返回的字符串与原字符串相同,说明 html tag 之间的内容无需翻译new_lines.append(line)print(line)else:line = add_language_tag_en(line)line_translated = add_language_tag_cn(line_translated)new_lines.append(line)print(line)new_lines.append(line_translated)print(line_translated)with open(path+target_filename, 'w') as f:f.write("\n".join(new_lines))

七、结果展示

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

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

八、总结

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

最后感谢粉丝【张茜】提问,感谢【xiaolai】大佬提供的代码和注释,感谢【

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

  1. 手把手教你用Python调用SCIP求解最优化模型

    手把手教你用Python调用SCIP求解最优化模型 一个简单的例子 Python调用SCIP求解最优化模型的一般步骤 创建模型对象 创建决策变量 设置目标函数 创建约束 创建一般约束 创建广义约束 求 ...

  2. python界面设计-手把手教你用Python设计一个简单的命令行界面

    原标题:手把手教你用Python设计一个简单的命令行界面 对 Python 程序来说,完备的命令行界面可以提升团队的工作效率,减少调用时可能碰到的困扰.今天,我们就来教大家如何设计功能完整的 Pyth ...

  3. 手把手教你用python抢票_又没抢到票?手把手教你用python抢票回家过年…

    原标题:又没抢到票?手把手教你用python抢票回家过年- 最近朋友圈刷屏:我又没抢到票!哭! 憋急,教程在此,有人愿意尝试吗? 先看看如何快速查看剩余火车票? 作者 protream 原文:http ...

  4. python网页爬虫循环获取_手把手教你用 Python 搞定网页爬虫

    原标题:手把手教你用 Python 搞定网页爬虫 编译:欧剃 作为数据科学家的第一个任务,就是做网页爬取.那时候,我对使用代码从网站上获取数据这项技术完全一无所知,它偏偏又是最有逻辑性并且最容易获得的 ...

  5. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  6. python global用法_14_手把手教你学Python之函数(下)

    变量作用域:根据变量定义的位置,可将变量分为全局变量和局部变量. 全局变量:定义在函数外面的变量,可以在多个函数中进行访问,但不能执行赋值操作.如果有赋值语句,相当于创建了一个同名的局部变量: 局部变 ...

  7. python代码示例图形-纯干货:手把手教你用Python做数据可视化(附代码)

    原标题:纯干货:手把手教你用Python做数据可视化(附代码) 导读:制作提供信息的可视化(有时称为绘图)是数据分析中的最重要任务之一.可视化可能是探索过程的一部分,例如,帮助识别异常值或所需的数据转 ...

  8. 怎么用python编贪吃蛇_少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二)

    原标题:少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二) 检测和判断 无论我们制作的简单或者复杂的游戏 这都是最关键的两个部分 事件处理循环 61. while True: # 游戏主循环 62 ...

  9. oracle数据库更新语句_20_手把手教你学Python之操作数据库

    数据库是数据的仓库,将大量数据按照一定的方式组织并存储起来,方便进行管理和维护,例如快速检索和统计等.数据库的主要特点: 以一定的方式组织.存储数据: 能为多个用户共享: 与程序彼此独立. -- 数据 ...

最新文章

  1. CCF CSP 201609-2 火车购票
  2. 精通JavaScript攻击框架:AttackAPI
  3. 福州PHP讲师招聘_“艺”起就业|招聘信息汇总
  4. TCP/IP、Http的区别
  5. 深入 Apache Kylin Cube 与查询优化
  6. 哨兵2号波段_分布式框架之高性能:Redis哨兵模式
  7. WF4.0实战(九):猜数字游戏,测下你的智力
  8. 个性化商品搜索相关研究梳理
  9. 文件系统读写Linux文件系统损坏的修复技术Strut2教程-java教程
  10. android 系统相册调用,各版本的区别总结
  11. 爱奇艺开播助手Flutter跨平台Hybrid实践\n
  12. 利用MapInfo将MapInfo格式数据转换成shp格式
  13. [转载]RAR压缩包密码破解原理
  14. 小学带计算机2000的检讨书,小学生检讨书范文
  15. 基金量化交易系统如何实现套利成功?
  16. 设计一个xml格式的文件
  17. 科目二 离合 要点记录
  18. Push还是Pull,这是个问题么?
  19. 修改linux系统iqn,linux iscsi initiator 安装配置
  20. Android平台App进程优先级

热门文章

  1. android 蓝牙开锁功能,uni-app蓝牙开锁篇
  2. 训练神经网络的五大算法
  3. 构建一个网站必知7个要领
  4. CCF计算机软件能力认证试题练习:201712-3 Crontab
  5. scis硬盘和SATA硬盘有什么区别
  6. HTML学习笔记-基础知识整理
  7. android智能语音播放器,android IM模块-语音-播放篇1
  8. 无情的社会——一个老人去死前的全过程【组图】
  9. ?id=1454320074805
  10. Refind安装……