Python实现网页内容转纯文本与EPUB电子书的完整指南

 更新时间:2026年02月03日 11:24:58   作者:站大爷IP  
在信息爆炸的时代,我们每天都会浏览大量网页内容,本文将通过Python实现两种主流保存方案,即纯文本格式TXT和电子书标准格式EPUB,感兴趣的小伙伴可以了解一下

在信息爆炸的时代,我们每天都会浏览大量网页内容。无论是新闻资讯、技术教程还是小说文学,如何将这些分散的网页内容高效保存并离线阅读,成为现代人的刚需。本文将通过Python实现两种主流保存方案:纯文本格式(TXT)和电子书标准格式(EPUB),并提供完整代码与实战案例。

一、技术选型与工具准备

1.1 核心工具链

  • 网页抓取requests库(HTTP请求)
  • HTML解析BeautifulSoup(静态内容解析)
  • 电子书生成ebooklib(EPUB标准支持)
  • 动态内容处理Selenium(可选,应对JavaScript渲染)

1.2 环境配置

pip install requests beautifulsoup4 lxml ebooklib selenium

注:若需处理动 态网页,还需下载对应浏览器的WebDriver(如ChromeDriver)

二、网页内容提取技术

2.1 基础抓取流程

import requests
from bs4 import BeautifulSoup

def fetch_webpage(url):
    headers = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # 异常处理
    return response.content

2.2 智能正文提取算法

通过分析100+新闻/博客网站结构,总结出以下高效提取策略:

def extract_content(html):
    soup = BeautifulSoup(html, 'lxml')
    
    # 优先匹配常见正文容器
    selectors = ['article', 'main', '.post-content', '#content']
    for selector in selectors:
        content = soup.select_one(selector)
        if content:
            return clean_content(content)
    
    # 回退方案:提取所有段落
    paragraphs = soup.find_all('p')
    if paragraphs:
        return '\n\n'.join(p.get_text() for p in paragraphs)
    
    return "提取失败"

def clean_content(element):
    # 移除广告/分享按钮等干扰元素
    for tag in ['script', 'style', 'iframe', 'nav', 'footer']:
        for item in element.find_all(tag):
            item.decompose()
    return '\n\n'.join(p.get_text() for p in element.find_all('p'))

实战案例:提取CSDN博客正文

url = "https://blog.csdn.net/example/article/details/123456"
html = fetch_webpage(url)
content = extract_content(html)
print(content[:200])  # 预览前200字符

三、纯文本保存方案

3.1 基础实现

def save_as_txt(title, content, filename=None):
    if not filename:
        safe_title = "".join(c for c in title if c.isalnum() or c in (' ', '_'))[:50]
        filename = f"{safe_title}.txt"
    
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(f"【标题】{title}\n\n")
        f.write(content)
    print(f"✅ 保存成功: {filename}")

3.2 增强功能

  • 自动分章节:通过标题标签(h1-h6)分割内容
  • 编码优化:处理特殊字符与换行符
  • 批量处理:爬取多篇文章合并保存

完整示例

def advanced_txt_save(url):
    html = fetch_webpage(url)
    soup = BeautifulSoup(html, 'lxml')
    
    # 提取标题与正文
    title = soup.title.string if soup.title else "无标题"
    content = extract_content(html)
    
    # 自动分章节(示例:按h2分割)
    chapters = []
    current_chapter = ""
    for element in soup.body.descendants:
        if element.name == 'h2':
            if current_chapter:
                chapters.append(current_chapter)
            current_chapter = f"\n\n{element.get_text()}\n"
        elif element.name == 'p' and current_chapter is not None:
            current_chapter += f"{element.get_text()}\n"
    if current_chapter:
        chapters.append(current_chapter)
    
    # 保存
    with open(f"{title}.txt", 'w', encoding='utf-8') as f:
        f.write(f"【全文目录】\n")
        for i, chap in enumerate(chapters, 1):
            f.write(f"{i}. {chap.split('\n')[0]}\n")
        f.write("\n" + "\n".join(chapters))

四、EPUB电子书生成技术

4.1 EPUB标准解析

EPUB是国际数字出版论坛(IDPF)制定的开放标准,具有三大核心组件:

  • 内容文档:XHTML格式的章节文件
  • 包装文件:OPF(Open Packaging Format)
  • 导航文件:NCX(Navigation Control file)

4.2 基础生成代码

from ebooklib import epub

def create_epub(title, author, content):
    book = epub.EpubBook()
    book.set_identifier('id123456')
    book.set_title(title)
    book.set_language('zh-CN')
    book.add_author(author)
    
    # 创建章节
    chapter = epub.EpubHtml(
        title=title,
        file_name='content.xhtml',
        lang='zh'
    )
    html_content = f"""
    <html>
        <head>
            <title>{title}</title>
            <style>
                body {{ font-family: "SimSun"; line-height: 1.6; }}
                h1 {{ text-align: center; }}
                p {{ text-indent: 2em; margin: 0.5em 0; }}
            </style>
        </head>
        <body>
            <h1>{title}</h1>
            {"".join(f"<p>{para}</p>" for para in content.split('\n\n') if para.strip())}
        </body>
    </html>
    """
    chapter.set_content(html_content)
    book.add_item(chapter)
    
    # 设置目录
    book.toc = [epub.Link('content.xhtml', title, 'intro')]
    book.spine = ['nav', chapter]
    
    # 添加导航文件
    book.add_item(epub.EpubNcx())
    book.add_item(epub.EpubNav())
    
    return book

def save_epub(book, filename=None):
    if not filename:
        filename = f"{book.title[:50]}.epub"
    epub.write_epub(filename, book)
    print(f"✅ EPUB生成成功: {filename}")

4.3 高级功能实现

案例:多章节小说生成

def novel_to_epub(url_template, chapters):
    book = epub.EpubBook()
    book.set_identifier('novel123')
    book.set_title("示例小说")
    book.set_language('zh')
    book.add_author("佚名")
    
    # 批量添加章节
    for i, chap_num in enumerate(chapters, 1):
        url = url_template.format(chap_num)
        html = fetch_webpage(url)
        soup = BeautifulSoup(html, 'lxml')
        
        # 假设每章标题在h1标签
        title = soup.h1.get_text() if soup.h1 else f"第{chap_num}章"
        content = clean_content(soup)
        
        chapter = epub.EpubHtml(
            title=title,
            file_name=f"chap_{i}.xhtml"
        )
        chapter.set_content(f"""
        <html>
            <body>
                <h2>{title}</h2>
                {"".join(f"<p>{para}</p>" for para in content.split('\n\n') if para.strip())}
            </body>
        </html>
        """)
        book.add_item(chapter)
        book.toc.append(epub.Link(f"chap_{i}.xhtml", title, f"chap{i}"))
    
    book.spine = ['nav'] + [epub.SpineItem(ref=f"chap_{i}.xhtml") for i in range(1, len(chapters)+1)]
    save_epub(book)

# 使用示例
novel_to_epub("https://example.com/novel/chapter_{}.html", range(1, 21))

五、实战综合案例

5.1 需求场景

将知乎专栏的多篇文章合并保存为EPUB,要求:

  • 自动抓取指定专栏的所有文章
  • 保留原文格式与图片
  • 生成可跳转的目录

5.2 解决方案

import os
from urllib.parse import urljoin

def zhihu_column_to_epub(column_url):
    # 1. 获取专栏文章列表(简化版,实际需分析知乎API)
    html = fetch_webpage(column_url)
    soup = BeautifulSoup(html, 'lxml')
    article_links = [urljoin(column_url, a['href']) 
                    for a in soup.select('.List-itemTitle a[href^="/p/"]')[:5]]  # 取前5篇示例
    
    # 2. 创建EPUB容器
    book = epub.EpubBook()
    book.set_identifier('zhihu123')
    column_title = soup.select_one('.ColumnHeader-title').get_text().strip()
    book.set_title(column_title)
    book.set_language('zh')
    book.add_author("知乎用户")
    
    # 3. 处理每篇文章
    for i, url in enumerate(article_links, 1):
        article_html = fetch_webpage(url)
        article_soup = BeautifulSoup(article_html, 'lxml')
        
        # 提取标题与正文
        title = article_soup.select_one('h1.Post-title').get_text().strip()
        content_div = article_soup.select_one('.Post-RichText')
        
        # 处理图片(保存到本地并修改路径)
        img_dir = f"images_{i}"
        os.makedirs(img_dir, exist_ok=True)
        for img in content_div.find_all('img'):
            img_url = urljoin(url, img['src'])
            img_data = requests.get(img_url).content
            img_name = img['src'].split('/')[-1]
            with open(f"{img_dir}/{img_name}", 'wb') as f:
                f.write(img_data)
            img['src'] = f"{img_dir}/{img_name}"
        
        # 生成章节
        chapter = epub.EpubHtml(
            title=title,
            file_name=f"article_{i}.xhtml"
        )
        chapter.set_content(f"""
        <html>
            <head>
                <style>
                    body {{ max-width: 800px; margin: 0 auto; font-family: "SimSun"; }}
                    img {{ max-width: 100%; height: auto; }}
                </style>
            </head>
            <body>
                <h1>{title}</h1>
                {str(content_div)}
            </body>
        </html>
        """)
        book.add_item(chapter)
        book.toc.append(epub.Link(f"article_{i}.xhtml", title, f"art{i}"))
    
    # 4. 生成EPUB
    book.spine = ['nav'] + [epub.SpineItem(ref=f"article_{i}.xhtml") for i in range(1, len(article_links)+1)]
    save_epub(book, f"{column_title}.epub")

# 使用示例
zhihu_column_to_epub("https://zhuanlan.zhihu.com/example")

六、性能优化与异常处理

6.1 常见问题解决方案

问题类型解决方案
反爬机制设置User-Agent,使用代理IP池
动态内容结合Selenium渲染JavaScript
编码错误强制指定response.encoding='utf-8'
大文件处理使用流式下载与分块处理

6.2 完整异常处理框架

def safe_fetch(url, max_retries=3):
    for _ in range(max_retries):
        try:
            headers = {'User-Agent': 'Mozilla/5.0'}
            response = requests.get(url, headers=headers, timeout=10)
            response.raise_for_status()
            response.encoding = 'utf-8'
            return response.content
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            continue
    raise RuntimeError(f"超过最大重试次数: {url}")

七、总结与扩展

7.1 技术价值

  • 知识管理:将碎片化网页内容系统化保存
  • 阅读体验:EPUB格式支持字体调整、书签、夜间模式等
  • 跨平台:生成的电子书可在Kindle、iOS/Android设备无缝阅读

7.2 扩展方向

  • 自动化爬虫:结合Scrapy框架实现大规模内容抓取
  • 增强排版:使用WeasyPrint将HTML转为PDF
  • 云存储:集成AWS S3或阿里云OSS实现自动备份
  • AI增强:通过NLP技术自动生成摘要与关键词

通过本文介绍的技术方案,读者可以轻松构建自己的网页内容保存系统。无论是简单的TXT备份,还是专业的EPUB电子书制作,Python都能提供高效可靠的解决方案。实际开发中,建议根据具体需求选择合适的技术组合,并始终遵守目标网站的robots.txt协议与版权法规。

到此这篇关于Python实现网页内容转纯文本与EPUB电子书的完整指南的文章就介绍到这了,更多相关Python网页内容转文本与EPUB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Pycharm界面的子窗口不见了的问题

    解决Pycharm界面的子窗口不见了的问题

    今天小编就为大家分享一篇解决Pycharm界面的子窗口不见了的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python魔法方法-属性访问控制详解

    python魔法方法-属性访问控制详解

    下面小编就为大家带来一篇python魔法方法-属性访问控制详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • TensorFlow进阶学习定制模型和训练算法

    TensorFlow进阶学习定制模型和训练算法

    本文将为你提供关于 TensorFlow 的中级知识,你将学习如何通过子类化构建自定义的神经网络层,以及如何自定义训练算法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Python  中的pass语句语法详析

    Python  中的pass语句语法详析

    这篇文章主要介绍了Python 中的pass语句语法详析,pass是一种空操作(null operation),解释器执行到它的时候,除了检查语法是否合法,什么也不做就直接跳过
    2022-07-07
  • Python+OpenCV之图像梯度详解

    Python+OpenCV之图像梯度详解

    这篇文章主要为大家详细介绍了Python OpenCV中图像梯度(Sobel算子、Scharr算子和Laplacian算子)的实现,感兴趣的小伙伴可以了解一下
    2022-09-09
  • 总结归纳python os库常用方法

    总结归纳python os库常用方法

    这篇文章主要为大家介绍了python os库常用方法的总结归纳,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • pytorch查看网络参数显存占用量等操作

    pytorch查看网络参数显存占用量等操作

    这篇文章主要介绍了pytorch查看网络参数显存占用量等操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • python中reduce()函数的使用方法示例

    python中reduce()函数的使用方法示例

    reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • python爬虫入门教程--正则表达式完全指南(五)

    python爬虫入门教程--正则表达式完全指南(五)

    要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,下面这篇文章主要给大家介绍了python爬虫之正则表达式的相关资料,需要的朋友可以参考下。
    2017-05-05
  • python3利用Axes3D库画3D模型图

    python3利用Axes3D库画3D模型图

    这篇文章主要为大家详细介绍了python3利用Axes3D库画3D模型图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论