Python实现网页内容转纯文本与EPUB电子书全攻略

简介: 本文介绍用Python自动化保存网页为TXT或EPUB电子书的完整方案:基于requests+BeautifulSoup抓取解析,ebooklib生成标准EPUB,支持正文智能提取、多章合并、图片保留与异常处理,兼顾实用性与合规性。(239字)

​免费编程软件「python+pycharm」
链接:https://pan.quark.cn/s/48a86be2fdc0

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

一、技术选型与工具准备
1.1 核心工具链
网页抓取:requests库(HTTP请求)
HTML解析:BeautifulSoup(静态内容解析)
电子书生成:ebooklib(EPUB标准支持)
动态内容处理:Selenium(可选,应对JavaScript渲染)
1.2 环境配置
pip install requests beautifulsoup4 lxml ebooklib selenium

二、网页内容提取技术
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:
safetitle = "".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_toepub("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, maxretries=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协议与版权法规。

​

目录
相关文章
|
10月前
|
数据管理 开发者
Pageadmin低代码平台的智能表单模块如何实现数据联动
本文以制造行业工单场景为例,介绍 PageAdmin 低代码平台智能表单的数据联动实现:管理员进入相关表单配置界面,为工单表单关联客户列表数据源并匹配对应字段,选客户后自动填充名称、地址,高效减少手工录入失误。
372 3
|
容器
Pyside6-第十三篇-布局(最后一章废话-理论篇)
Pyside6-第十三篇-布局(最后一章废话-理论篇)
1789 0
|
机器学习/深度学习 算法 PyTorch
论文阅读笔记 | 目标检测算法——DETR
论文阅读笔记 | 目标检测算法——DETR
2590 0
论文阅读笔记 | 目标检测算法——DETR
|
1月前
|
缓存 JSON API
阿里云千问Qwen3.8‑Max深度解析:核心能力、订阅计费规则、API接入配置与生产落地完整教程
Qwen3.8‑Max作为千问系列新一代MoE架构旗舰基座,总参数量达到2.4万亿,激活参数950亿,是面向复杂专业任务、长周期智能体、工程级代码开发、多模态深度解析的高阶大模型,原生支持文本、图像、视频多模态输入,最大上下文窗口达到百万Token,最大输出Token支持131072,内置深度思考推理链路,在编程、科研、法律金融专业分析、长视频文档解析、自主Agent任务等场景能力表现突出。很多开发者在项目前期直接接入该旗舰模型,却对模型能力边界、多种计费模式、订阅套餐权益、API参数配置、上下文缓存优化缺乏完整认知,出现成本失控、接口报错、长文本信息丢失、深度思考模式额外消耗大量Token等
2119 5
|
缓存 安全 Java
Spring Security权限管理解析
Spring Security是Spring生态中的核心安全框架,采用认证与授权分离架构,提供高度可定制的权限管理方案。其基于过滤器链实现认证流程,通过SecurityContextHolder管理用户状态,并结合RBAC模型与动态权限决策,支持细粒度访问控制。通过扩展点如自定义投票器、注解式校验与前端标签,可灵活适配多租户、API网关等复杂场景。结合缓存优化与无状态设计,适用于高并发与前后端分离架构。
855 0
|
人工智能 监控 安全
人人都是造梦者:AI时代的创意落地指南
有好想法因为"不会技术"而只能停留在脑海里?如果技术门槛不再是阻碍,你最想实现什么?在发现好想法后,如何落地自己的AI创意?这个过程可能需要哪些东西?本文手把手教你如何让自己的创意落地。
861 16
人人都是造梦者:AI时代的创意落地指南
|
安全 Linux 虚拟化
macOS Ventura 13.7.7 (22H722) 正式版 ISO、IPSW、PKG 下载
macOS Ventura 13.7.7 (22H722) 正式版 ISO、IPSW、PKG 下载
5526 0
|
机器学习/深度学习 人工智能 资源调度
AI大模型训练管理工具:千亿参数时代的指挥中枢
本内容揭示了大模型训练中三大核心挑战:实验复现难、资源利用率低、合规风险高,并提出“三维控制塔”解决方案,涵盖实验管理、资源调度与合规追踪。推荐Immuta + 板栗看板等工具组合助力不同规模团队实现高效、合规、低成本的AI训练。
|
机器学习/深度学习 存储 并行计算
Pytorch自动混合精度(AMP)介绍与使用 - autocast和Gradscaler
Pytorch自动混合精度(AMP)介绍与使用 - autocast和Gradscaler
Pytorch自动混合精度(AMP)介绍与使用 - autocast和Gradscaler
|
Python
python实现短信发送
python实现短信发送,近期老收到自称自己是京东金融的私人电话,骗取钱财,我直接一顿臭骂,他还还口,所以就有了这个短信息发给他。。、。
22798 48

热门文章

最新文章