2011-05-17 15 views
7

我終於升級(重寫;))我的第一個Django應用程序,但我正在遷移所有的內容。清理難看的所見即所得HTML代碼? Python或* nix工具

我愚蠢地給用戶一個完整的WYSIWYG編輯器對於某些任務,生成的HTML代碼當然是非常醜陋的,並且比內容更多的額外標籤。

有誰知道我可以用來清理代碼的庫或外部shell應用程序?

我有時會使用整潔,但據我所知,不會做我在問什麼。我想簡化所有額外的跨度和其他垃圾標籤。我用一些正則表達式清理了最冒犯的攻擊風格,但是我只用正則表達式就需要很長時間才能做更多的事情。

任何想法?

+1

標準答案是「美麗的湯」。 「額外的跨度」和「垃圾標籤」是您需要非常小心地定義的,因此您可以在不移除內容的情況下移除標籤。 – 2011-05-17 10:12:32

+0

它*可能是一個更好的主意,可以重做HTML而不是清理你所擁有的。 – 2011-05-25 10:09:54

回答

0

標準答案是Beautiful Soup

「額外的跨度」和「垃圾標籤」是您需要非常小心地定義的內容,因此您可以在不移除內容的情況下移除標籤。

我建議你做兩件事。

  1. 修復您的應用程序,以便用戶在任何情況下都不提供HTML。 Django可以使用更加用戶友好的RST標記。 http://docs.djangoproject.com/en/1.3/ref/templates/builtins/#django-contrib-markup

  2. 寫美麗的湯分析器和用戶的內容變成RST標記。保留結構元素(標題,列表等)並儘可能地丟失格式。

2

美麗的湯可能會得到你一個更完整的解決方案,但你也許可以得到一些清理與html5lib做更簡單(如果你確定與HTML5規則):

import html5lib 
from html5lib import sanitizer, treebuilders, treewalkers, serializer 

my_html = "<i>Some html fragment</I>" #intentional 'I' 

html_parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom")) 
dom_tree = html_parser.parseFragment(my_html) 
walker = treewalkers.getTreeWalker("dom") 
stream = walker(dom_tree) 
s = serializer.htmlserializer.HTMLSerializer(omit_optional_tags=False, quote_attr_values=True) 
cleaned_html = s.render(stream) 
cleaned_html == '<i>Some html fragment</i>" 

您也可以通過初始化您html_parser這樣消毒HTML:

html_parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"), tokenizer=sanitizer.HTMLSanitizer) 
3

你也可以看看Bleach基於HTML消毒劑白名單。它使用html5lib來完成Kyle發佈的內容,但是您將更好地控制最終輸出中允許使用哪些元素和屬性。