2011-04-08 19 views
5

Cómo comprimir (minimizar) HTML de python; Sé que puedo usar algunas expresiones regulares para quitar espacios y otras cosas, pero quiero un compilador real que use pure python (para que pueda usarse en Google App Engine).Comprimir (minimizar) HTML de python

Hice una prueba en un compresor html en línea y guardó el 65% del tamaño html. Quiero eso, pero de pitón.

Respuesta

6

Puede utilizar htmlmin a minify su html:

import htmlmin 

html = """ 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>Bootstrap Case</title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</head> 
<body> 
<div class="container"> 
    <h2>Well</h2> 
    <div class="well">Basic Well</div> 
</div> 
</body> 
</html> 
""" 

minified = htmlmin.minify(html.decode("utf-8"), remove_empty_space=True) 
print(minified) 
4

supongo que en GAE no hay realmente necesidad de cercenar su html como GAE ya gzip Caching & GZip on GAE (Community Wiki)

no he probado pero la versión minified de html probablemente va a ganar sólo el 1% de su tamaño, ya que sólo quitar el espacio una vez que ambas versiones están comprimidas.

Si desea guardar el almacenamiento, por ejemplo mediante memcached it, tiene más interés en gzip (incluso con bajo nivel de compresión) que eliminando espacio, ya que en python probablemente sea más pequeño y más rápido que el procesado en C del pitón puro

+0

gracias por señalar sacarme esto. Veo en los registros que algunos navegadores aún no son compatibles con gzip; pero mirando los registros de nuevo, las solicitudes que recibo así no son mucho. –

+5

Quitar el 65% del HTML original probablemente no ahorrará un 65% cuando se haya comprimido, pero aún así se guardará algo. – geoffspear

+0

Además, no olvide que a veces el html se almacena en Memcache y definitivamente quiere comprimirlo antes –

0

escribí un script de construcción que duplica mis plantillas en otro directorio y luego usar este truco para decirle a mi solicitud para seleccionar la plantilla correcta en el modo de desarrollo, o en la producción:

DEV = os.environ['SERVER_SOFTWARE'].startswith('Development') and not PRODUCTION_MODE 

TEMPLATE_DIR = 'templates/2012/head/' if DEV else 'templates/2012/output/' 

si su servidor web no tiene gzip, este no es el punto, debes guardar cada byte que puedas para razones de rendimiento.

Si nos fijamos en algunos de los sitios más grandes por ahí, que a menudo hacen cosas como escribir HTML válido para salvar bytes, por ejemplo, es común omitir las comillas dobles en los atributos id en etiquetas HTML, por ejemplo:

<did id=mydiv> ... </div> 

En lugar de:

<did id="mydiv"> ... </div> 

Y hay varios ejemplos como éste, pero eso no viene al alcance de la rosca supongo.

Volviendo a la pregunta, armé un pequeño script de compilación que minimiza su HTML, CSS y JS. Advertencia: no cubre el caso de la etiqueta PRE.

import os 
import re 
import sys 

from subprocess import call 

HEAD_DIR = 'templates/2012/head/' 

OUT_DIR = 'templates/2012/output/' 

REMOVE_WS = re.compile(r"\s{2,}").sub 

YUI_COMPRESSOR = 'java -jar tools/yuicompressor-2.4.7.jar ' 

CLOSURE_COMPILER = 'java -jar tools/compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS ' 

def ensure_dir(f): 
    d = os.path.dirname(f) 
    if not os.path.exists(d): 
     os.makedirs(d) 

def getTarget(fn): 
    return fn.replace(HEAD_DIR, OUT_DIR) 

def processHtml(fn, tg): 
    f = open(fn, 'r') 
    content = f.read() 
    content = REMOVE_WS(" ", content) 
    ensure_dir(tg) 
    d = open(tg, 'w+') 
    d.write(content) 
    content 

def processCSS(fn, tg): 
    cmd = YUI_COMPRESSOR + fn + ' -o ' + tg 
    call(cmd, shell=True) 
    return 

def processJS(fn, tg): 
    cmd = CLOSURE_COMPILER + fn + ' --js_output_file ' + tg 
    call(cmd, shell=True) 
    return 

# Script starts here. 
ensure_dir(OUT_DIR) 
for root, dirs, files in os.walk(os.getcwd()): 
    for dir in dirs: 
    print "Processing", os.path.join(root, dir) 
    for file in files: 
    fn = os.path.join(root) + '/' + file 
    if fn.find(OUT_DIR) > 0: 
     continue 
    tg = getTarget(fn) 
    if file.endswith('.html'): 
     processHtml(fn, tg) 
    if file.endswith('.css'): 
     processCSS(fn, tg) 
    if file.endswith('.js'): 
     processJS(fn, tg)  
1

htmlmin y html_slimmer son algunas sencillas herramientas html minifying de pitón. Tengo millones de páginas html almacenadas en mi base de datos y ejecutando htmlmin, puedo reducir el tamaño de página entre 5 y 50%. Ninguno de ellos hace un trabajo óptimo con la minificación html completa (es decir, el color de fuente # 00000 se puede reducir a # 000), pero es un buen comienzo. Tengo un bloque try/except que ejecuta htmlmin y luego, si eso falla, html_slimmer porque htmlmin parece proporcionar una mejor compresión, pero no admite caracteres no ascii.

Código Ejemplo:

import htmlmin 
from slimmer import html_slimmer # or xhtml_slimmer, css_slimmer 
try: 
    html=htmlmin.minify(html, remove_comments=True, remove_empty_space=True) 
except: 
    html=html_slimmer(html.strip().replace('\n',' ').replace('\t',' ').replace('\r',' ') ) 

buena suerte!

Cuestiones relacionadas