¿Limpiar el código WYSIWYG feo? Utilidad Python o * nix

Finalmente estoy actualizando ( reescribiendo ;)) mi primera aplicación de Django, pero estoy migrando todo el contenido.

Tontamente les di a los usuarios un editor WYSIWYG completo para ciertas tareas, el código HTML producido es, por supuesto, terriblemente feo con más tags adicionales que contenido.

¿Alguien sabe de una biblioteca o aplicación de shell externa que pueda usar para limpiar el código?

A veces uso tidy, pero por lo que sé, eso no hace lo que estoy pidiendo. Quiero simplificar todo el espacio adicional y otras tags de basura. Limpié los estilos ofensivos más ofensivos con algunas expresiones regulares, pero me llevaría mucho tiempo hacer algo más usando solo expresiones regulares.

¿Algunas ideas?

También puedes echarle un vistazo a Bleach, un desinfectante HTML basado en listas blancas. Utiliza html5lib para hacer lo que Kyle publicó, pero tendrás mucho más control sobre qué elementos y atributos se permiten en la salida final.

Beautiful Soup probablemente obtendrá una solución más completa, pero es posible que puedas realizar una limpieza más sencillamente con html5lib (si estás de acuerdo con las reglas html5):

 import html5lib from html5lib import sanitizer, treebuilders, treewalkers, serializer my_html = "Some html fragment" #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 == 'Some html fragment" 

También puedes sanear el html inicializando tu html_parser de esta manera:

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

La respuesta estándar es Beautiful Soup .

El “espacio adicional” y las “tags de basura” es algo que debe definir con mucho cuidado para que pueda eliminar las tags sin eliminar el contenido.

Te sugiero que hagas dos cosas.

  1. Arregle su aplicación para que los usuarios no proporcionen HTML bajo ninguna circunstancia. Django puede usar el marcado RST, que es mucho más fácil de usar. http://docs.djangoproject.com/en/1.3/ref/templates/builtins/#django-contrib-markup

  2. Escriba un analizador de Beautiful Soup y transforme el contenido del usuario en el formato RST. Mantenga los elementos estructurales (encabezados, listas, etc.) y pierda el formato en la medida de lo posible.