Python实现下载网页并将资源改为本地相对路径

 更新时间:2026年01月03日 08:48:28   作者:weixin_46244623  
这篇文章主要为大家详细介绍了如何使用Python轻松实现下载网页并将资源改为本地相对路径,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

一、教程目标

本教程实现以下功能:

1、下载指定 URL 的 HTML 页面

2、自动下载页面中引用的:

  • CSS 文件
  • JS 文件
  • 图片(img)

3、解析 CSS 文件中的:

  • 背景图片(url(…))
  • 字体文件(@font-face)

4、将 HTML 和 CSS 中的外链资源全部修改为本地相对路径

5、最终生成一个可离线访问的网页目录

适合用于:

  • 网页备份
  • 离线浏览
  • 页面模板保存
  • 简单静态站点克隆

二、环境准备

1. Python 版本

建议使用 Python 3.7 及以上版本

2. 安装依赖库

pip install requests beautifulsoup4

三、完整代码(中文注释版)

import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, urljoin
import re


def download_file(url, folder):
    """
    下载单个文件并保存到指定目录
    :param url: 文件的绝对 URL
    :param folder: 保存目录
    """
    response = requests.get(url)
    if response.status_code == 200:
        # 从 URL 中解析出文件名
        filename = os.path.basename(urlparse(url).path)
        save_path = os.path.join(folder, filename)

        # 以二进制方式写入文件
        with open(save_path, 'wb') as f:
            f.write(response.content)


def download_and_modify_links(html_url, save_folder, domain_to_remove):
    """
    下载 HTML 页面,并将其中的 CSS、JS、IMG 等资源下载到本地,
    同时把所有链接修改为相对路径
    :param html_url: 目标网页 URL
    :param save_folder: 本地保存目录
    :param domain_to_remove: 预留参数(当前版本未使用)
    """

    response = requests.get(html_url)
    if response.status_code != 200:
        print(f"页面下载失败,状态码:{response.status_code}")
        return

    # 使用 BeautifulSoup 解析 HTML
    soup = BeautifulSoup(response.text, 'html.parser')

    # 创建保存资源的目录
    os.makedirs(save_folder, exist_ok=True)

    # 处理 link、img、script 标签
    # link -> CSS
    # img  -> 图片
    # script -> JS
    for tag, attribute in [('link', 'href'), ('img', 'src'), ('script', 'src')]:
        elements = soup.find_all(tag, {attribute: True})
        for element in elements:
            original_link = element[attribute]

            # 将相对路径转换为绝对路径
            absolute_link = urljoin(html_url, original_link)

            # 提取文件名
            filename = os.path.basename(urlparse(absolute_link).path)
            if not filename:
                continue

            # 修改 HTML 中的引用为相对路径
            element[attribute] = f"./{filename}"

            # 下载资源文件
            download_file(absolute_link, save_folder)

    # 单独处理 CSS 文件,解析其中的图片和字体
    css_elements = soup.find_all('link', {'rel': 'stylesheet'})
    for css_element in css_elements:
        css_url = urljoin(html_url, css_element['href'])
        css_response = requests.get(css_url)

        if css_response.status_code != 200:
            continue

        css_text = css_response.text

        # 处理 CSS 中的 url(...) 图片
        image_urls = re.findall(r'url\((.*?)\)', css_text)
        for image_url in image_urls:
            clean_url = image_url.strip('\'"')
            absolute_image_url = urljoin(css_url, clean_url)

            filename = os.path.basename(urlparse(absolute_image_url).path)
            if not filename:
                continue

            # 替换 CSS 中的路径为本地相对路径
            css_text = css_text.replace(image_url, f"./{filename}")

            # 下载图片
            download_file(absolute_image_url, save_folder)

        # 处理 @font-face 中的字体文件
        font_urls = re.findall(r'@font-face.*?url\((.*?)\)', css_text, re.S)
        for font_url in font_urls:
            clean_url = font_url.strip('\'"')
            absolute_font_url = urljoin(css_url, clean_url)

            filename = os.path.basename(urlparse(absolute_font_url).path)
            if not filename:
                continue

            css_text = css_text.replace(font_url, f"./{filename}")
            download_file(absolute_font_url, save_folder)

        # 保存修改后的 CSS 文件
        css_filename = os.path.basename(urlparse(css_url).path)
        css_save_path = os.path.join(save_folder, css_filename)

        with open(css_save_path, 'w', encoding='utf-8') as f:
            f.write(css_text)

        # 修改 HTML 中的 CSS 引用路径
        css_element['href'] = f"./{css_filename}"

    # 保存最终修改后的 HTML 文件
    html_save_path = os.path.join(save_folder, 'index.html')
    with open(html_save_path, 'w', encoding='utf-8') as f:
        f.write(str(soup))

    print("HTML 页面及相关资源已成功下载并本地化")

四、主程序入口示例

if __name__ == "__main__":
    html_url = "http://example.com/"
    save_folder = "downloaded_files"
    domain_to_remove = "http://example.com"

    download_and_modify_links(html_url, save_folder, domain_to_remove)

五、运行结果目录结构示例

downloaded_files/
├── index.html

打开 index.html 即可离线访问网页。

到此这篇关于Python实现下载网页并将资源改为本地相对路径的文章就介绍到这了,更多相关Python下载网页资源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 超详细注释之OpenCV制作图像Mask

    超详细注释之OpenCV制作图像Mask

    这篇文章主要介绍了OpenCV制作图像Mask,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 详解python方法之绑定方法与非绑定方法

    详解python方法之绑定方法与非绑定方法

    这篇文章主要介绍了python方法之绑定方法与非绑定方法的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • 基于Python matplotlib库绘制箱线图

    基于Python matplotlib库绘制箱线图

    这篇文章主要为大家分享了如何利用Python中的matplotlib库实现绘制箱线图与异常值的输出,文中的示例代码讲解详细,需要的可以参考一下
    2022-04-04
  • Python爬虫 bilibili视频弹幕提取过程详解

    Python爬虫 bilibili视频弹幕提取过程详解

    这篇文章主要介绍了Python爬虫 bilibili视频弹幕提取过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python基础入门学习笔记(Python环境搭建)

    python基础入门学习笔记(Python环境搭建)

    这篇文章主要介绍了python基础入门学习笔记,这是开启学习python基础知识的第一篇,夯实Python基础,才能走的更远,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 用Python计算三角函数之acos()方法的使用

    用Python计算三角函数之acos()方法的使用

    这篇文章主要介绍了用Python计算三角函数之acos()方法的使用,是Python学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python3多线程操作简单示例

    Python3多线程操作简单示例

    这篇文章主要介绍了Python3多线程操作,结合实例形式分析了Python3兼容Python2使用_thread进行多线程操作的简单实现技巧,需要的朋友可以参考下
    2018-05-05
  • Python光学仿真理解Jones矩阵学习

    Python光学仿真理解Jones矩阵学习

    这篇文章主要为大家介绍了Python光学仿真理解Jones矩阵的学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • Python常用库推荐

    Python常用库推荐

    本文给大家推荐的是在Python学习使用中经常需要用到的第三方库和工具,非常的实用,有需要的小伙伴可以参考下
    2016-12-12
  • python逆向入门教程

    python逆向入门教程

    这篇文章主要介绍了python逆向入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论