2011-04-08 24 views
5

Cách nén (thu nhỏ) HTML từ python; Tôi biết tôi có thể sử dụng một số regex để dải không gian và những thứ khác, nhưng tôi muốn có một trình biên dịch thực sự sử dụng python tinh khiết (vì vậy nó có thể được sử dụng trên Google App Engine).Nén (giảm thiểu) HTML từ python

Tôi đã thử nghiệm trên máy nén html trực tuyến và nó đã lưu 65% kích thước html. Tôi muốn điều đó, nhưng từ python.

Trả lời

6

Bạn có thể sử dụng htmlmin để rút gọn html của bạn:

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

Tôi giả sử rằng trong GAE không có thực sự cần cho giảm bớt html của bạn như GAE đã gzip nó Caching & GZip on GAE (Community Wiki)

tôi đã không kiểm tra nhưng phiên bản minified html có thể sẽ giành chiến thắng chỉ có 1% kích thước vì nó chỉ loại bỏ không gian khi cả hai phiên bản đều được nén.

Nếu bạn muốn lưu bộ nhớ, ví dụ bằng cách ghi nhớ nó, bạn quan tâm nhiều hơn để gzip nó (thậm chí ở mức độ nén thấp) so với loại bỏ không gian như trong python nó có thể nhỏ hơn và nhanh hơn như được xử lý trong C của trăn tinh khiết

+0

nhờ chỉ cho tôi ra khỏi đây. Tôi thấy trong nhật ký rằng một số trình duyệt chưa hỗ trợ gzip; nhưng nhìn vào nhật ký một lần nữa, các yêu cầu tôi nhận được như thế này không nhiều lắm. –

+5

Xóa 65% của HTML gốc có thể sẽ không tiết kiệm 65% khi được nén, nhưng nó vẫn sẽ lưu một số thứ. – geoffspear

+0

Cũng đừng quên rằng đôi khi html được lưu trữ trên memcache và bạn defiantly muốn nén nó trước –

0

tôi đã viết một kịch bản build rằng bản sao mẫu của tôi vào một thư mục khác và sau đó tôi sử dụng thủ thuật này để nói với ứng dụng của tôi để chọn mẫu đúng trong chế độ phát triển, hoặc trong sản xuất:

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

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

dù nó được gzipped bởi máy chủ web của bạn không thực sự là điểm, bạn nên lưu mọi byte mà bạn có thể lý do hiệu suất.

Nếu bạn xem một số trang web lớn nhất, chúng thường làm những việc như viết html không hợp lệ để lưu byte, ví dụ: thường bỏ qua dấu ngoặc kép trong thuộc tính id trong thẻ html, ví dụ:

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

Thay vì:

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

Và có rất nhiều ví dụ như thế này, nhưng đó là bên cạnh phạm vi các chủ đề tôi đoán.

Quay lại câu hỏi, tôi đặt cùng một tập lệnh xây dựng nhỏ giúp rút gọn HTML, CSS và JS của bạn. Caveat: Nó không bao gồm trường hợp của thẻ 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 là một số công cụ rút gọn html đơn giản cho python. Tôi có hàng triệu trang html được lưu trữ trong cơ sở dữ liệu của tôi và chạy htmlmin, tôi có thể giảm kích thước trang từ 5 đến 50%. Không ai trong số họ làm một công việc tối ưu ở mức tối thiểu html hoàn chỉnh (nghĩa là màu phông chữ # 00000 có thể được giảm xuống # 000), nhưng đó là một khởi đầu tốt. Tôi có một khối try/except chạy htmlmin và sau đó nếu điều đó không thành công, html_slimmer vì htmlmin dường như cung cấp nén tốt hơn, nhưng nó không hỗ trợ các ký tự ascii không.

Ví dụ Code:

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

Good Luck!

Các vấn đề liên quan