You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium/Request结合ebooklib提取EPUB纯文本并翻译重存

实现EPUB文件提取纯文本、翻译后重新保存的方案

一、提取EPUB中的纯文本(保留章节结构)

ebooklib读取的EPUB章节内容是HTML格式,需要用BeautifulSoup提取纯文本,同时记录每个章节的原始HTML结构,方便后续替换翻译内容。

  1. 安装依赖库
pip install ebooklib beautifulsoup4
  1. 提取纯文本的代码示例
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模拟浏览器(稳定性高,适合小批量文本)

  1. 安装依赖并下载对应浏览器驱动(如ChromeDriver)
pip install selenium
  1. 翻译代码示例
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:03:06