如何修改Python代码为每个外部CSS链接生成独立内容文件?
修改方案
要实现为每个外部CSS链接生成独立的CSS文件,需要做以下几个关键调整:
- 处理相对路径的CSS链接:用
urllib.parse.urljoin把页面URL和相对路径拼接成完整的请求地址 - 遍历每个外部CSS链接,发送请求获取对应CSS内容
- 为每个CSS文件生成唯一文件名(比如按序号命名,或从链接提取文件名)
- 增加异常处理,避免单个CSS请求失败导致整个程序中断
以下是修改后的完整代码:
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin def page_Css(page_html, base_url): # 查找所有外部CSS链接 external_css = page_html.find_all('link', rel="stylesheet") # 查找所有内部CSS internal_css = page_html.find_all('style') # 打印统计信息 print(f"{base_url} 页面包含 {len(external_css)} 个外部CSS标签") print(f"{base_url} 页面包含 {len(internal_css)} 个内部CSS标签") # 写入内部CSS到文件 with open("internal_css.css", "w", encoding='utf-8') as file: for index, css_code in enumerate(internal_css): if css_code.string: # 避免空内容导致报错 file.write(f"\n //{index+1} Style\n") file.write(css_code.string) # 下载并保存每个外部CSS到独立文件 for index, css_tag in enumerate(external_css): css_href = css_tag.get('href') if not css_href: print(f"第 {index+1} 个CSS链接为空,跳过") continue # 拼接完整URL(处理相对路径) full_css_url = urljoin(base_url, css_href) print(f"正在下载第 {index+1} 个CSS: {full_css_url}") try: # 请求CSS内容 css_response = requests.get(full_css_url, timeout=10) css_response.raise_for_status() # 检查请求是否成功 # 生成文件名:方案1-按序号命名(稳定无冲突) filename = f"external_css_{index+1}.css" # 方案2-从URL提取文件名(可选,需处理特殊情况) # filename = full_css_url.split('/')[-1] if full_css_url.split('/')[-1].endswith('.css') else f"external_css_{index+1}.css" # 写入CSS内容到文件 with open(filename, "w", encoding='utf-8') as file: file.write(css_response.text) print(f"已保存到 {filename}") except Exception as e: print(f"下载第 {index+1} 个CSS失败: {str(e)}") # 目标页面URL url = "https://www.geeksforgeeks.org/" # 发送请求获取页面内容 response = requests.get(url) response.raise_for_status() # 检查页面请求是否成功 # 解析HTML page_html = BeautifulSoup(response.text, 'html.parser') # 提取并保存CSS page_Css(page_html, url)
关键修改说明
- 传入base_url参数:将页面URL传入函数,用于拼接相对路径的CSS链接,解决相对URL无法直接请求的问题
- 异常处理:捕获请求过程中的网络错误、HTTP错误等,确保单个CSS下载失败不会中断整个程序
- 编码处理:打开文件时指定
encoding='utf-8',避免中文或特殊字符出现乱码 - 空内容检查:内部CSS部分增加非空判断,避免写入空内容导致报错
- 文件名方案:提供两种命名方式,序号命名更稳定,适合大多数场景;从URL提取文件名更贴合原资源命名,需处理无后缀或特殊字符情况
内容的提问来源于stack exchange,提问作者Smelt
相关产品推荐
相关产品推荐

