网页压缩.md 4.6 KB

#python #前端

通过unity转成html后,会有很多格式化相关字符&空格&换行,也会占据很多空间,可以通过以下脚本,对html进行压缩处理; 在执行脚本之前,需要先确认,是安装了,以下库

pip install bs4
pip install BeautifulSoup

html_minifier.py

# html_minifier.py
import re
import logging
from bs4 import BeautifulSoup, Comment

class HTMLMinifier:
    """
    HTML压缩工具类,提供静态方法用于HTML最小化处理
    功能:
    1. 移除所有HTML注释
    2. 压缩空白字符(保留pre/code/textarea内容)
    3. 可选移除冗余属性
    """
    
    @staticmethod
    def minify(html_content, remove_redundant_attrs=False):
        """
        最小化HTML内容
        
        参数:
            html_content (str): 原始HTML内容
            remove_redundant_attrs (bool): 是否移除冗余属性(如type="text/javascript")
            
        返回:
            str: 压缩后的HTML内容
        异常:
            ValueError: 当输入不是字符串时
        """
        if not isinstance(html_content, str):
            raise ValueError("输入必须是字符串类型")
            
        try:
            soup = BeautifulSoup(html_content, 'html.parser')
            
            # 移除注释
            for comment in soup.find_all(string=lambda text: isinstance(text, Comment)):
                comment.extract()
            
            # 压缩空白
            for element in soup.find_all(string=True):
                if element.parent.name not in ['pre', 'code', 'textarea']:
                    element.replace_with(re.sub(r'\s+', ' ', element.string.strip()))
            
            # 可选:移除冗余属性
            if remove_redundant_attrs:
                for tag in soup.find_all(True):
                    if tag.name == 'script' and tag.get('type') == 'text/javascript':
                        del tag['type']
                    if tag.name == 'style' and tag.get('type') == 'text/css':
                        del tag['type']
                    if tag.name == 'link' and tag.get('type') == 'text/css':
                        del tag['type']
            
            return str(soup)
        except Exception as e:
            logging.error(f"HTML压缩失败: {str(e)}")
            raise

def process_file(input_path, output_path=None, **kwargs):
    """
    文件处理入口函数
    
    参数:
        input_path (str): 输入文件路径
        output_path (str): 输出文件路径(默认添加.min后缀)
        **kwargs: 传递给minify的参数
        
    返回:
        tuple: (压缩后内容, 压缩率)
    """
    try:
        # 读取输入文件
        with open(input_path, 'r', encoding='utf-8') as f:
            original = f.read()
        
        # 处理输出路径
        if not output_path:
            if input_path.endswith('.html'):
                output_path = input_path.replace('.html', '.min.html')
            else:
                output_path = input_path + '.min'
        
        # 执行压缩
        minified = HTMLMinifier.minify(original, **kwargs)
        
        # 写入输出文件
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(minified)
        
        # 计算压缩率
        orig_size = len(original.encode('utf-8'))
        min_size = len(minified.encode('utf-8'))
        ratio = (orig_size - min_size) / orig_size * 100
        
        logging.info(f"压缩完成: {orig_size} → {min_size} 字节 (缩减 {ratio:.1f}%)")
        return minified, ratio
        
    except Exception as e:
        logging.error(f"文件处理失败: {str(e)}")
        raise

if __name__ == '__main__':
    import argparse
    
    # 配置日志
    logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
    
    # 设置命令行参数
    parser = argparse.ArgumentParser(description='HTML文件压缩工具')
    parser.add_argument('input', help='输入HTML文件路径')
    parser.add_argument('-o', '--output', help='输出文件路径')
    parser.add_argument('-r', '--remove-attrs', action='store_true', help='移除冗余属性')
    args = parser.parse_args()
    
    # 执行压缩
    try:
        process_file(
            args.input,
            output_path=args.output,
            remove_redundant_attrs=args.remove_attrs
        )
    except Exception as e:
        logging.error(f"处理失败: {e}")
        exit(1)

调用方式

示例,同级目录:

python .\html_minifier.py .\NewTest_2.html

![[Pasted image 20250620101456.png]]