当前位置: 首页 > 科技观察

教你用Python脚本调用DeepLAPIPro输入电子书行自动中英翻译

时间:2023-03-23 01:50:24 科技观察

大家好,我是Python进阶。1.前言前几天有个叫【张倩】的粉丝让我看一段关于电子书英文自动翻译的代码。2.介绍这个小项目是git上一个叫[xiaolai]的大佬分享的。它看起来很新,并且是在不久前发布的,也就是14天前。一本中译约39万字的书,1.5小时左右即可处理(包括基本格式编辑)。这速度太恐怖了!下面就来看看这款神器的使用方法吧!3.电子书格式转换途径首先需要将Kindle中的电子书导出,并使用ePubor进行deDRM,然后将电子书转换为epub文件。我总是直接在亚马逊上购买,然后在我的电脑上安装一个旧版本的Kindle应用程序,右键单击书名,下载它,然后在不打开电子书的情况下退出Kindle。ePuborUltimate也是一款付费软件,可以去除旧Kindle下载的电子书的DRM;将awz文件转换为epub文件。(可以参考这个页面)然后,使用免费软件Calibre将epub转成htmlz文件(压缩包)。(我尝试使用命令行工具包pandoc,但经过比较,我发现Calibre在保留样式方面可能更好......)在终端中使用unzip命令解压htmlz存档。4、之所以选择html格式作为翻译格式,是为了保留书中大量的脚注、尾注和链接;DeepL有一个特殊的API参数来处理xml标签,tag_handling="xml";可以通过css文件随意设置显示样式,比较Flexible;可以通过插入javascript函数指定特定语言的显示(比如只显示中文);可以作为源文件转换任何格式的电子书……另外,调用tag_handling="xml"后,DeepLAPI返回的翻译非常有规律,可以保留所有html标签;并且,“返回的字符串”与“原始字符串”相同,可以作为判断该行是否已经翻译的依据,如果没有,在生成的翻译html文件中就不需要该行了反复出现...5.清理html整理html文件很麻烦。更方便的方法是使用BeautifulSoup模块。BeautifulSoup本来是一个爬虫工具,但它是一种非常方便的清理html文件的方式。下面的脚本主要完成以下任务:首先去掉html文件中的所有\n;将所有内容单独放在一条线上;将所有内容单独放在一条线上;删除所有\n里面;并在;之前添加一个空行......当然,您可以在此处进行更多您喜欢的格式清理。为方便起见,path和source_filename和target_filename是分开指定的。代码如下:importbs4importrepath="JohnLaw/"#必须有/source_filename="index.html"target_filename="index2.html"html=open(path+source_filename)htmltext=html.read()soup=bs4在文件夹名称的末尾。BeautifulSoup(htmltext)#Removeall\n...htmltext=str(bs4.BeautifulSoup(htmltext)).replace("\n","")#之前加一个空行pttn=r'

'rpl=r'\n\n
're.findall(pttn,htmltext)htmltext=re.sub(pttn,rpl,htmltext)#"#注意,你要订阅的是DeepLAPIProtarget_language="ZH"##当然你可以设置目标语言为任何DeepL支持的语言path="JohnLaw/"#文件夹名称末尾为There/source_filename="index2.html"#上一步生成的文件成为“源文件”target_filename="index3.html"deftranslate(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正确处理htmltags},)返回结果。json()["translations"][0]["text"]defadd_language_tag_en(html):pttn=re.compile(r'^<(.*?)class="(.*?)">',re.M)rpl=r'<\1class="\2en">'re.findall(pttn,html)html=re.sub(pttn,rpl,html)returnhtmldefadd_language_tag_cn(html):pttn=re.compile(r'^<(.*?)class="(.*?)">',re.M)rpl=r'<\1class="\2cn">'re.findall(pttn,html)html=re.sub(pttn,rpl,html)returnhtmllines=open(path+source_filename,"r").readlines()new_lines=[]line_count=0startline=16endline=4032forlineinlines:line_count+=1ifline_countendlineorline.strip()=='':new_lines.append(line)print(line)continuesucceeded=Falsewhilenotsucceeded:#下面粗略的try...except是为了防止DeepL在执行过程中出现连接错误导致翻译任务中断...try:line_translated=translate(line)#下面一行确保返回的字符串被转换成整行,而不是包含\n的多行文本line_translated=line_translated.replace("\n","")succeeded=Trueexcept:succeeded=Falseifline.strip()==line_translated.strip():#返回的字符串与原字符串相同,说明htmltags之间的内容不需要翻译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)withopen(path+target_filename,'w')asf:f.write("\n".join(new_lines))7.结果显示1.运行代码后,它会自动读取待翻译的文件,然后进行翻译,如下图:2.运行运行程序后,可以得到想要的结果,如下图所示:8.总结大家好,我是Python进阶。本文主要介绍使用Python脚本调用DeepLAPIPro进入电子书。英文自动翻译的方法,代码测试可行,欢迎大家积极尝试,下次遇到需要自动翻译的时候,不妨调用一下这个API,说不定会事半功倍!