当前位置: 首页 > news >正文

Python 教程:下载网页并将资源改为本地相对路径

一、教程目标

本教程实现以下功能:

  1. 下载指定 URL 的 HTML 页面

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

    • CSS 文件
    • JS 文件
    • 图片(img)
  3. 解析 CSS 文件中的:

    • 背景图片(url(…))
    • 字体文件(@font-face)
  4. 将 HTML 和 CSS 中的外链资源全部修改为本地相对路径

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

适合用于:

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

二、环境准备

1. Python 版本

建议使用 Python 3.7 及以上版本

2. 安装依赖库

pipinstallrequests beautifulsoup4

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

importosimportrequestsfrombs4importBeautifulSoupfromurllib.parseimporturlparse,urljoinimportredefdownload_file(url,folder):""" 下载单个文件并保存到指定目录 :param url: 文件的绝对 URL :param folder: 保存目录 """response=requests.get(url)ifresponse.status_code==200:# 从 URL 中解析出文件名filename=os.path.basename(urlparse(url).path)save_path=os.path.join(folder,filename)# 以二进制方式写入文件withopen(save_path,'wb')asf:f.write(response.content)defdownload_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)ifresponse.status_code!=200:print(f"页面下载失败,状态码:{response.status_code}")return# 使用 BeautifulSoup 解析 HTMLsoup=BeautifulSoup(response.text,'html.parser')# 创建保存资源的目录os.makedirs(save_folder,exist_ok=True)# 处理 link、img、script 标签# link -> CSS# img -> 图片# script -> JSfortag,attributein[('link','href'),('img','src'),('script','src')]:elements=soup.find_all(tag,{attribute:True})forelementinelements:original_link=element[attribute]# 将相对路径转换为绝对路径absolute_link=urljoin(html_url,original_link)# 提取文件名filename=os.path.basename(urlparse(absolute_link).path)ifnotfilename:continue# 修改 HTML 中的引用为相对路径element[attribute]=f"./{filename}"# 下载资源文件download_file(absolute_link,save_folder)# 单独处理 CSS 文件,解析其中的图片和字体css_elements=soup.find_all('link',{'rel':'stylesheet'})forcss_elementincss_elements:css_url=urljoin(html_url,css_element['href'])css_response=requests.get(css_url)ifcss_response.status_code!=200:continuecss_text=css_response.text# 处理 CSS 中的 url(...) 图片image_urls=re.findall(r'url\((.*?)\)',css_text)forimage_urlinimage_urls:clean_url=image_url.strip('\'"')absolute_image_url=urljoin(css_url,clean_url)filename=os.path.basename(urlparse(absolute_image_url).path)ifnotfilename: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)forfont_urlinfont_urls:clean_url=font_url.strip('\'"')absolute_font_url=urljoin(css_url,clean_url)filename=os.path.basename(urlparse(absolute_font_url).path)ifnotfilename:continuecss_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)withopen(css_save_path,'w',encoding='utf-8')asf:f.write(css_text)# 修改 HTML 中的 CSS 引用路径css_element['href']=f"./{css_filename}"# 保存最终修改后的 HTML 文件html_save_path=os.path.join(save_folder,'index.html')withopen(html_save_path,'w',encoding='utf-8')asf: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即可离线访问网页。

http://www.jsqmd.com/news/177674/

相关文章:

  • YOLOFuse轻量化优势明显:边缘设备部署潜力巨大
  • YOLOFuse代币经济模型探讨:激励贡献者机制
  • YOLOFuse函数注释完整度:Google风格文档字符串
  • sti.dll文件损坏丢失找不到 打不开程序 下载方法
  • 告别复杂依赖安装!YOLOFuse社区镜像预装所有环境,即拉即跑
  • Spring-boot读书笔记一关于test method namefolder build
  • QT Creator添加OpenCV库即qt引入OpenCV
  • YOLOFuse与智能家居联动:海康威视摄像头对接
  • 深入解析:【Effective Objective-C 2.0】协议与分类
  • YOLOFuse Docker镜像拉取命令:标准容器化部署方式
  • YOLOFuse在PyCharm中调试技巧:远程连接容器开发指南
  • [AI 工程实践] 远程调用 Ollama 报错解析:如何解决“本地文件找不到”的误区
  • Mac 使用 React-Native 使用无线调试商米机,配合Stripe 终端
  • YOLOFuse能否识别行人与车辆?城市安防场景测试结果
  • 实用指南:【前瞻创想】Kurator分布式云原生平台架构解析与实践指南
  • YOLOFuse部署常见错误汇总:python软链接修复方案
  • YOLOFuse机房部署规范:多节点集群安装要点
  • YOLOFuse与中小学AI教育:科普活动演示素材
  • what kind of people speak English.
  • [Dify实战] 客服质检机器人:自动抽检、评分、给出改进建议
  • YOLOFuse与碳中和目标:绿色AI节能计算
  • YOLOFuse配置文件修改指南:自定义数据集路径设置方法
  • YOLOFuse与无人机红外相机配套使用实战记录
  • YOLOFuse与云从科技协同:国产AI全栈解决方案
  • YOLOFuse高校合作计划:实验室共建联合项目
  • YOLOFuse租用GPU算力推荐配置:RTX 3090起步
  • YOLOFuse博士研究支撑平台:前沿算法验证基座
  • Spring-boot读书笔记一javax.sql.DataSource
  • python图片批处理系统
  • YOLOFuse与AR眼镜结合:第一视角辅助检测