最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)下載網(wǎng)頁(yè)并將資源改為本地相對(duì)路徑

 更新時(shí)間:2026年01月03日 08:48:28   作者:weixin_46244623  
這篇文章主要為大家詳細(xì)介紹了如何使用Python輕松實(shí)現(xiàn)下載網(wǎng)頁(yè)并將資源改為本地相對(duì)路徑,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

一、教程目標(biāo)

本教程實(shí)現(xiàn)以下功能:

1、下載指定 URL 的 HTML 頁(yè)面

2、自動(dòng)下載頁(yè)面中引用的:

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

3、解析 CSS 文件中的:

  • 背景圖片(url(…))
  • 字體文件(@font-face)

4、將 HTML 和 CSS 中的外鏈資源全部修改為本地相對(duì)路徑

5、最終生成一個(gè)可離線訪問(wèn)的網(wǎng)頁(yè)目錄

適合用于:

  • 網(wǎng)頁(yè)備份
  • 離線瀏覽
  • 頁(yè)面模板保存
  • 簡(jiǎn)單靜態(tài)站點(diǎn)克隆

二、環(huán)境準(zhǔn)備

1. Python 版本

建議使用 Python 3.7 及以上版本

2. 安裝依賴庫(kù)

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):
    """
    下載單個(gè)文件并保存到指定目錄
    :param url: 文件的絕對(duì) 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)

        # 以二進(jìn)制方式寫入文件
        with open(save_path, 'wb') as f:
            f.write(response.content)


def download_and_modify_links(html_url, save_folder, domain_to_remove):
    """
    下載 HTML 頁(yè)面,并將其中的 CSS、JS、IMG 等資源下載到本地,
    同時(shí)把所有鏈接修改為相對(duì)路徑
    :param html_url: 目標(biāo)網(wǎng)頁(yè) URL
    :param save_folder: 本地保存目錄
    :param domain_to_remove: 預(yù)留參數(shù)(當(dāng)前版本未使用)
    """

    response = requests.get(html_url)
    if response.status_code != 200:
        print(f"頁(yè)面下載失敗,狀態(tài)碼:{response.status_code}")
        return

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

    # 創(chuàng)建保存資源的目錄
    os.makedirs(save_folder, exist_ok=True)

    # 處理 link、img、script 標(biāo)簽
    # 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]

            # 將相對(duì)路徑轉(zhuǎn)換為絕對(duì)路徑
            absolute_link = urljoin(html_url, original_link)

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

            # 修改 HTML 中的引用為相對(duì)路徑
            element[attribute] = f"./{filename}"

            # 下載資源文件
            download_file(absolute_link, save_folder)

    # 單獨(dú)處理 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 中的路徑為本地相對(duì)路徑
            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 頁(yè)面及相關(guān)資源已成功下載并本地化")

四、主程序入口示例

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)

五、運(yùn)行結(jié)果目錄結(jié)構(gòu)示例

downloaded_files/
├── index.html

打開(kāi) index.html 即可離線訪問(wèn)網(wǎng)頁(yè)。

到此這篇關(guān)于Python實(shí)現(xiàn)下載網(wǎng)頁(yè)并將資源改為本地相對(duì)路徑的文章就介紹到這了,更多相關(guān)Python下載網(wǎng)頁(yè)資源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 超詳細(xì)注釋之OpenCV制作圖像Mask

    超詳細(xì)注釋之OpenCV制作圖像Mask

    這篇文章主要介紹了OpenCV制作圖像Mask,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 詳解python方法之綁定方法與非綁定方法

    詳解python方法之綁定方法與非綁定方法

    這篇文章主要介紹了python方法之綁定方法與非綁定方法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-08-08
  • 基于Python matplotlib庫(kù)繪制箱線圖

    基于Python matplotlib庫(kù)繪制箱線圖

    這篇文章主要為大家分享了如何利用Python中的matplotlib庫(kù)實(shí)現(xiàn)繪制箱線圖與異常值的輸出,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-04-04
  • Python爬蟲 bilibili視頻彈幕提取過(guò)程詳解

    Python爬蟲 bilibili視頻彈幕提取過(guò)程詳解

    這篇文章主要介紹了Python爬蟲 bilibili視頻彈幕提取過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python基礎(chǔ)入門學(xué)習(xí)筆記(Python環(huán)境搭建)

    python基礎(chǔ)入門學(xué)習(xí)筆記(Python環(huán)境搭建)

    這篇文章主要介紹了python基礎(chǔ)入門學(xué)習(xí)筆記,這是開(kāi)啟學(xué)習(xí)python基礎(chǔ)知識(shí)的第一篇,夯實(shí)Python基礎(chǔ),才能走的更遠(yuǎn),感興趣的小伙伴們可以參考一下
    2016-01-01
  • 用Python計(jì)算三角函數(shù)之a(chǎn)cos()方法的使用

    用Python計(jì)算三角函數(shù)之a(chǎn)cos()方法的使用

    這篇文章主要介紹了用Python計(jì)算三角函數(shù)之a(chǎn)cos()方法的使用,是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python3多線程操作簡(jiǎn)單示例

    Python3多線程操作簡(jiǎn)單示例

    這篇文章主要介紹了Python3多線程操作,結(jié)合實(shí)例形式分析了Python3兼容Python2使用_thread進(jìn)行多線程操作的簡(jiǎn)單實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-05-05
  • Python光學(xué)仿真理解Jones矩陣學(xué)習(xí)

    Python光學(xué)仿真理解Jones矩陣學(xué)習(xí)

    這篇文章主要為大家介紹了Python光學(xué)仿真理解Jones矩陣的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • Python常用庫(kù)推薦

    Python常用庫(kù)推薦

    本文給大家推薦的是在Python學(xué)習(xí)使用中經(jīng)常需要用到的第三方庫(kù)和工具,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-12-12
  • python逆向入門教程

    python逆向入門教程

    這篇文章主要介紹了python逆向入門教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論

潮安县| 九江县| 西充县| 浪卡子县| 平原县| 信丰县| 内丘县| 黄山市| 岗巴县| 射阳县| 上饶县| 区。| 堆龙德庆县| 香河县| 湘乡市| 保康县| 玉田县| 朔州市| 连江县| 荆州市| 水城县| 富民县| 囊谦县| 铁岭市| 阳高县| 库车县| 天等县| 昭通市| 高邮市| 云林县| 高雄市| 盐津县| 苏州市| 信丰县| 黔东| 固阳县| 马龙县| 平和县| 东城区| 阳原县| 永吉县|