自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

手把手教你用 Python 腳本調(diào)用 DeepL API Pro 進(jìn)電子書的行進(jìn)行中英文自動翻譯

開發(fā) 后端
html 文件整理起來比較麻煩,一個比較方便的手段是使用 BeautifulSoup 模塊。BeautifulSoup 本來是爬蟲工具,但,它又很方便的手段可以清理 html 文件。

[[439869]]

大家好,我是我是Python進(jìn)階者。

一、前言

前幾天有個叫【張茜】的粉絲找我看了一個代碼,關(guān)于電子書中英文自動翻譯的,感覺挺有意思,這里拿出來給大家分享下。

二、簡介

這個小項目是git上一個叫【xiaolai】的大佬分享的,看上去還是挺新的,發(fā)布不太久,14天前發(fā)布的。

一本書中文譯文大約 39 萬字的書,差不多用 1.5 小時就可以處理完畢(包括基本的格式編輯),這速度恐怖如斯!下面一起來看看這款神器的使用方法吧!

三、電子書格式轉(zhuǎn)換路徑

首先,需要將電子書從 Kindle 中導(dǎo)出來,并用 ePubor 進(jìn)行 deDRM,而后將電子書轉(zhuǎn)換成 epub 文件。

我都是在 Amazon 上直接買,而后在電腦上安裝一個老版本的 Kindle App,用鼠標(biāo)右鍵點擊書名,下載,并不打開該電子書,而后退出 Kindle。

ePubor Ultimate 也是個收費軟件,能把舊版 Kindle 下載的電子書的 DRM 去掉;將 awz 文件轉(zhuǎn)換成 epub 文件。(可參考這個網(wǎng)頁)

然后,再用免費軟件 Calibre 將 epub 轉(zhuǎn)換成 htmlz 文件(一個壓縮包)。(我嘗試過使用命令行工具包 pandoc,但,比較之后,發(fā)現(xiàn) Calibre 在保留樣式方面可能更好一點……)

在 Terminal 里用 unzip 命令解開 htmlz 壓縮包。

四、選擇 html 格式作為翻譯格式的原因

可以保留書中大量的腳注、尾注及其鏈接;DeepL 有專門的 API 參數(shù)處理 xml tag,tag_handling="xml";

可以通過 css 文件隨意設(shè)置顯示樣式,比較靈活;

可以通過插入 javascript 函數(shù)指定某種特定語言的顯示(比如,只顯示中文);

可以用來作為源文件轉(zhuǎn)換成任意格式的電子書……

另外,在調(diào)用 tag_handling="xml" 之后,DeepL API 返回的譯文非常規(guī)整,能夠保留所有 html tag;并且,“返回字符串” 與 “原字符串” 相同,可以作為一個判斷依據(jù) —— 該行有沒有被翻譯,如果沒有,在生成的譯文 html 文件中,該行沒必要重復(fù)出現(xiàn)……

五、清理 html

html 文件整理起來比較麻煩,一個比較方便的手段是使用 BeautifulSoup 模塊。BeautifulSoup 本來是爬蟲工具,但,它又很方便的手段可以清理 html 文件。

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

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

單獨放在一行;將所有

也單獨放在一行;將

內(nèi)部的所有 \n 全都去掉;并在之前加上一個空行;…… 當(dāng)然,你可以在這里做更多你自己喜歡做的格式清理。為了方便起見,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 進(jìn)行翻譯

將清理過的 html 交給以下腳本,逐行提交給 DeepL 翻譯,并返回。

為了方便起見,path 和 source_filename 以及 target_filename 都單獨指定。

lines 是 source_filename 的內(nèi)容 new_lines 是將要放到 target_filename 中的內(nèi)容 startline 是 “從哪一行開始提交 DeepL 翻譯” endline 是 “到哪一行開始結(jié)束提交 DeepL 翻譯”。代碼如下:

  1. import re 
  2. import requests 
  3.  
  4. auth_key = "<your DeepL API Pro authentication key>" # 注意,要訂閱的是 DeepL API Pro 
  5. target_language = "ZH"  ## 當(dāng)然,你可以將目標(biāo)語言設(shè)置成任何 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", # 這個參數(shù)確保 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,用來防止執(zhí)行過程中出現(xiàn) DeepL 連接錯誤而導(dǎo)致翻譯任務(wù)中斷…… 
  55.         try: 
  56.             line_translated = translate(line) 
  57.             # 以下一行確保將返回的字符串轉(zhuǎn)換成一整行,而非含有 \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 之間的內(nèi)容無需翻譯 
  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)) 

七、結(jié)果展示

1、運行代碼之后,會自動讀取待翻譯的文件,然后進(jìn)行翻譯,如下圖所示:

2、運行完程序之后,可以得到想要的結(jié)果,如下圖所示:

八、總結(jié)

大家好,我是Python進(jìn)階者。這篇文章主要給大家介紹了使用Python腳本調(diào)用DeepL API Pro進(jìn)電子書的行中英文自動翻譯的方法,代碼親測可行,歡迎大家積極嘗試,下次再遇到需要自動翻譯的時候,不妨調(diào)用下這個API,興許事半功倍呢!

 

責(zé)任編輯:武曉燕 來源: Python爬蟲與數(shù)據(jù)挖掘
相關(guān)推薦

2021-08-09 13:31:25

PythonExcel代碼

2022-08-04 10:39:23

Jenkins集成CD

2021-03-02 09:05:13

Python

2022-10-19 14:30:59

2021-05-10 06:48:11

Python騰訊招聘

2021-02-02 13:31:35

Pycharm系統(tǒng)技巧Python

2021-12-11 20:20:19

Python算法線性

2020-11-08 14:13:31

Python帕累托分析開發(fā)

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2021-02-06 14:55:05

大數(shù)據(jù)pandas數(shù)據(jù)分析

2020-12-17 09:40:01

Matplotlib數(shù)據(jù)可視化命令

2021-03-23 09:05:52

PythonExcelVlookup

2021-05-17 21:30:06

Python求均值中值

2009-04-22 09:17:19

LINQSQL基礎(chǔ)

2021-02-10 09:34:40

Python文件的壓縮PyCharm

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)

2021-01-08 10:32:24

Charts折線圖數(shù)據(jù)可視化

2020-03-08 22:06:16

Python數(shù)據(jù)IP

2012-01-11 13:40:35

移動應(yīng)用云服務(wù)
點贊
收藏

51CTO技術(shù)棧公眾號