2011-04-08 746 views
5

如何從python壓縮(最小化)HTML;我知道我可以使用一些正則表達式去除空格和其他東西,但是我想要一個真正的使用純Python的編譯器(所以它可以在Google App Engine上使用)。壓縮(最小化)來自python的HTML

我做了一個在線html壓縮器的測試,它節省了65%的html大小。我想要那個,但是來自python。

回答

6

您可以使用htmlmin來縮小你的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

我想在GAE沒有真的需要縮小你的HTML作爲GAE已經gzip壓縮它Caching & GZip on GAE (Community Wiki)

我沒有測試,但HTML的精縮版可能會獲勝只有1%的大小,因爲它只是刪除空間一旦兩個版本都被壓縮。

如果你想節省空間,例如通過memcached的話,你必須比在蟒蛇消除空間更感興趣gzip壓縮它(即使在壓縮的低電平)在C處理相反,它很可能是更小,更快純Python

+0

感謝您指出我出這一點。我在日誌中看到一些瀏覽器尚不支持gzip;但再次查看日誌,我得到的要求並不多。 – 2011-04-08 15:42:24

+5

刪除65%的原始HTML可能不會在壓縮時保存65%,但它仍然可以節省一些東西。 – geoffspear 2011-04-09 14:10:31

+0

另外不要忘記,有時候html會存儲在memcache上,你很難在之前壓縮它 – 2011-05-18 12:21:48

0

的我寫的複製我的模板到另一個目錄中生成腳本,然後我用這種伎倆來告訴我的應用程序選擇,或在生產發展模式正確的模板:

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

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

無論它是由你的網絡服務器gzipped是不是真的重點,你應該保存每個字節,你可以爲性能的原因。

如果你在一些最大的網站看看在那裏,他們經常做這樣的事情寫無效的HTML保存字節,例如,常見的是省略雙引號ID在html標籤屬性,例如:

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

相反的:

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

而且有像這樣的幾個例子,但是這線程我猜的範圍旁邊。

回到問題,我放了一個小的生成腳本,縮小您的HTML,CSS和JS。警告:它不包括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

htmlminhtml_slimmer是Python的一些簡單的HTML縮小文件的工具。我有數百萬的html頁面存儲在我的數據庫中,並運行htmlmin,我可以將頁面大小縮小5%到50%。他們都沒有在完成html縮小時做出最佳工作(即字體顏色#00000可以減少到#000),但這是一個好的開始。我有一個try/except塊運行htmlmin,然後如果失敗,html_slimmer,因爲htmlmin似乎提供更好的壓縮,但它不支持非ascii字符。

示例代碼:

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

祝您好運!