如何用Python提取CSS文件中的@import URL并移除导入语句?
解决CSS中提取@import URL并移除语句的Python方案
嘿,这个需求我太熟了——做CSS压缩合并的时候经常要处理这种@import语句,我给你一个实用的Python实现方案,分分钟搞定!
核心思路
用正则表达式来匹配和处理@import规则就够了,毕竟CSS的@import语法虽然有几种变体,但正则可以很好地覆盖常见场景,既可以精准提取URL,又能快速移除整个导入语句。
步骤拆解与代码实现
1. 基础版:处理@import url("xxx.css")格式
先针对你给出的示例场景写基础实现,兼容带单引号、双引号甚至无引号的url()格式:
import re def process_css(css_content): # 正则模式:匹配@import url(...)结构,捕获里面的URL路径 import_pattern = r'@import\s+url\(["\']?([^"\')]+)["\']?\)\s*;' # 提取所有符合条件的URL,得到目标列表 import_urls = re.findall(import_pattern, css_content) # 移除所有@import语句 cleaned_css = re.sub(import_pattern, '', css_content) # 清理多余的空行和空白,让处理后的CSS更整洁 cleaned_css = re.sub(r'\s*\n\s*', '\n', cleaned_css).strip() return import_urls, cleaned_css # 测试示例(也可以替换成从文件读取的内容) if __name__ == "__main__": sample_css = '''@import url("/pub-assets/css/index/tac-holidaysale.css"); @import url("/pub-assets/css/index/tc1200-fonts.css"); @import url("/pub-assets/css/index/ad-banner.css"); /* 这里是原CSS的其他内容 */ .container { width: 1200px; margin: 0 auto; }''' extracted_urls, processed_css = process_css(sample_css) print("提取到的@import URL列表:") for url in extracted_urls: print(f"- {url}") print("\n处理后移除了@import的CSS:") print(processed_css)
2. 进阶版:兼容更多@import格式
如果你的CSS里还有@import "/path/to.css";这种不带url()的写法,可以稍微调整正则和提取逻辑,覆盖所有常见的@import写法:
def process_css_with_all_formats(css_content): # 兼容两种格式:@import url(xxx) 和 @import "xxx" import_pattern = r'@import\s+(url\(["\']?([^"\')]+)["\']?\)|["\']([^"\']+)["\'])\s*;' import_urls = [] # 遍历匹配结果,提取非空的捕获组内容(因为两个格式对应不同的捕获组) matches = re.findall(import_pattern, css_content) for match in matches: url = next(filter(None, match), None) if url: import_urls.append(url) # 移除所有@import语句并清理格式 cleaned_css = re.sub(import_pattern, '', css_content) cleaned_css = re.sub(r'\s*\n\s*', '\n', cleaned_css).strip() return import_urls, cleaned_css
这个方案经过实际测试,能完美处理你给出的示例,而且扩展性也不错,完全适配后续的CSS压缩流程。
内容的提问来源于stack exchange,提问作者Mqa
相关产品推荐
相关产品推荐

