如何用Selenium/Request结合ebooklib提取EPUB纯文本并翻译重存
实现EPUB文件提取纯文本、翻译后重新保存的方案
一、提取EPUB中的纯文本(保留章节结构)
ebooklib读取的EPUB章节内容是HTML格式,需要用BeautifulSoup提取纯文本,同时记录每个章节的原始HTML结构,方便后续替换翻译内容。
- 安装依赖库
pip install ebooklib beautifulsoup4
- 提取纯文本的代码示例
from ebooklib import epub from bs4 import BeautifulSoup def extract_epub_text(epub_path): book = epub.read_epub(epub_path) chapter_data = [] for item in book.get_items(): # 只处理HTML格式的章节内容 if item.get_type() == ebooklib.ITEM_DOCUMENT: soup = BeautifulSoup(item.get_content(), 'html.parser') # 提取纯文本,保留换行结构 raw_text = soup.get_text(strip=False, separator='\n') # 保存章节ID、原始HTML和纯文本 chapter_data.append({ 'id': item.get_id(), 'html_content': str(soup), 'raw_text': raw_text }) return book, chapter_data
二、调用DeepL网页版翻译文本
提供两种实现方式,按需选择:
方式1:使用Selenium模拟浏览器(稳定性高,适合小批量文本)
- 安装依赖并下载对应浏览器驱动(如ChromeDriver)
pip install selenium
- 翻译代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def translate_with_selenium(text, target_lang='ZH'): driver = webdriver.Chrome() driver.get('https://www.deepl.com/translator') # 等待输入框加载完成 input_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'textarea[dl-test="translator-source-input"]')) ) input_box.clear() input_box.send_keys(text) # 等待翻译结果加载(可根据网络情况调整时长) time.sleep(3) output_box = driver.find_element(By.CSS_SELECTOR, 'div[dl-test="translator-target-output"]') translated_text = output_box.text driver.quit() return translated_text
方式2:使用Requests调用DeepL网页接口(速度快,需处理反爬)
注意:DeepL网页接口参数可能随时变化,需自行抓包验证
import requests def translate_with_requests(text, target_lang='ZH'): url = 'https://www.deepl.com/jsonrpc' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Content-Type': 'application/json', 'Referer': 'https://www.deepl.com/translator' } payload = { "jsonrpc": "2.0", "method": "LMT_handle_jobs", "params": { "jobs": [{"kind": "default", "raw_en_sentence": text}], "lang": {"target_lang": target_lang}, "priority": 1 }, "id": 12345 } response = requests.post(url, json=payload, headers=headers) result = response.json() translated_text = result['result']['translations'][0]['beams'][0]['sentences'][0]['text'] return translated_text
三、替换翻译内容并重新生成EPUB
将翻译后的文本替换回原始章节的HTML结构中,保留原有的格式、样式和媒体资源,最后保存为新EPUB。
def replace_and_save_epub(original_book, chapter_data, output_path): for chapter in chapter_data: item = original_book.get_item_with_id(chapter['id']) soup = BeautifulSoup(chapter['html_content'], 'html.parser') # 遍历所有非空白文本节点进行替换 for text_node in soup.find_all(string=True): if text_node.strip(): # 长文本建议分段翻译后再替换,避免翻译限制 translated = translate_with_selenium(text_node.strip()) # 可替换为requests方法 text_node.replace_with(translated) # 更新章节内容 item.set_content(str(soup).encode('utf-8')) # 保存新EPUB epub.write_epub(output_path, original_book, {}) # 主流程调用示例 if __name__ == '__main__': input_epub = 'input.epub' output_epub = 'translated.epub' book, chapters = extract_epub_text(input_epub) replace_and_save_epub(book, chapters, output_epub)
注意事项
- 长文本处理:章节文本过长时,建议按段落拆分后逐个翻译,避免触发DeepL的内容限制
- 反爬应对:使用Requests方式需定期检查接口参数,必要时添加代理、调整请求头
- 格式精准保留:若需保留原EPUB的格式(如加粗、斜体),可针对
<b>、<i>等标签内的文本单独翻译,避免破坏标签结构
内容的提问来源于stack exchange,提问作者bymechul
相关产品推荐
相关产品推荐

