2011-04-08 12 views
5

Jak skompresować (zminimalizować) HTML z Pythona; Wiem, że mogę użyć jakiegoś regex do stripowania przestrzeni i innych rzeczy, ale chcę mieć prawdziwy kompilator używając czystego Pythona (aby mógł być użyty w Google App Engine).Kompresuj (minimalizuj) HTML z Pythona

Zrobiłem test na kompresorze html online i zaoszczędziłem 65% rozmiaru html. Chcę tego, ale z Pythona.

Odpowiedz

6

Można użyć htmlmin do minify 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

Przypuszczam, że w GAE nie jest naprawdę potrzebne do minify swojej html jak GAE już gzip to Caching & GZip on GAE (Community Wiki)

nie testowałem, ale minified wersja html prawdopodobnie wygra tylko 1% wielkości jak to tylko usunąć przestrzeń gdy obie wersje są skompresowane.

Jeśli chcesz zapisać pamięć, na przykład przez memcached, masz większe zainteresowanie gzipem (nawet przy niskim poziomie kompresji) niż usuwanie miejsca tak jak w pythonie będzie prawdopodobnie mniejsze i szybsze, jak przetworzone w C zamiast tego czystego pytona

+0

dzięki za wskazanie mi tego. W dziennikach widzę, że niektóre przeglądarki jeszcze nie obsługują gzip; ale patrząc ponownie na dzienniki, prośby, które otrzymuję w ten sposób, nie są aż takie. –

+5

Usunięcie 65% oryginalnego HTML prawdopodobnie nie przyniesie 65% oszczędności po skompresowaniu, ale nadal będzie coś zapisywać. – geoffspear

+0

Pamiętaj też, że czasami HTML jest przechowywany na memcache i zdecydowanie chcesz go skompresować przed –

0

napisałem skrypt kompilacji, które powiela moje szablony do innego katalogu, a następnie użyć tej sztuczki, aby powiedzieć mój wniosek, aby wybrać odpowiedni szablon w trybie rozwoju lub produkcji:

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

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

Decyduje, czy jest zgaszony przez twój serwer sieciowy, tak naprawdę nie jest to kwestia, powinieneś zapisać każdy bajt, dla którego możesz przyczyny wydajności.

Jeśli spojrzeć na niektóre z największych stron tam, często robią rzeczy jak pisanie nieprawidłowy kod HTML, aby zapisać bajtów, na przykład, powszechne jest pominięcie cudzysłowów w atrybuty id w znacznikach HTML, na przykład:

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

Zamiast:

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

i istnieje kilka przykładów, jak ten jeden, ale nie w tym zakresie wątku chyba.

Powróciłem do pytania, przygotowałem skrypt, który minimalizuje twój HTML, CSS i JS. Zastrzeżenie: Nie obejmuje przypadku znacznika 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 i html_slimmer kilka prostych narzędzi html minifying dla Pythona. Mam miliony stron HTML przechowywanych w mojej bazie danych i uruchomionych htmlmin, jestem w stanie zmniejszyć rozmiar strony od 5 do 50%. Żadne z nich nie wykonuje optymalnej pracy przy kompletnej minimalizacji html (tj. Kolor czcionki # 00000 można zmniejszyć do # 000), ale to dobry początek. Mam blok try/except, który uruchamia htmlmin, a następnie, jeśli to się nie powiedzie, html_slimmer, ponieważ wydaje się, że htmlmin zapewnia lepszą kompresję, ale nie obsługuje znaków non ascii.

Przykład Kod:

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',' ') ) 

Powodzenia!