Estoy agregando contenido de algunas fuentes externas y estoy descubriendo que parte contiene errores en su HTML/DOM. Un buen ejemplo sería HTML que falta etiquetas de cierre o atributos de etiqueta malformados. ¿Hay alguna forma de solucionar los errores en Python de forma nativa o en cualquier otro módulo que pueda instalar?Limpiar HTML en Python
Respuesta
Sugeriría Beautifulsoup. Tiene un analizador maravilloso que puede tratar con etiquetas mal formadas con bastante gracia. Una vez que haya leído en todo el árbol, puede simplemente dar como resultado el resultado.
from BeautifulSoup import BeautifulSoup
tree = BeautifulSoup(bad_html)
good_html = tree.prettify()
Lo he usado muchas veces y funciona de maravilla. Si simplemente está sacando los datos de bad-html, BeautifulSoup realmente brilla cuando se trata de extraer datos.
Tenga cuidado con el rendimiento, BeautifulSoup es muy expansivo. – Tarantula
@Tarantula. Estoy de acuerdo, BeautifulSoup es bastante lento, pero es lo único que he visto que puede analizar algunas de esas tablas locas malformadas basadas en HTML que hay. – JudoWill
Eso es verdad JudoWill. – Tarantula
Hay enlaces de python para el HTML Tidy Library Project, pero la limpieza automática de HTML roto es un hueso duro de roer. No es tan diferente de tratar de corregir automáticamente el código fuente; hay demasiadas posibilidades. Todavía tendrá que revisar el resultado y casi con seguridad realizar correcciones adicionales a mano.
estoy usando lxml para convertir HTML a XML adecuada (bien formado):
from lxml import etree
tree = etree.HTML(input_text.replace('\r', ''))
output_text = '\n'.join([ etree.tostring(stree, pretty_print=True, method="xml")
for stree in tree ])
... y haciendo gran cantidad de eliminación de '' elementos peligrosos en el medio ....
Esto se puede hacer utilizando la función tidy_document en el módulo tidylib.
import tidylib
html = '<html>...</html>'
inputEncoding = 'utf8'
options = {
str("output-xhtml"): True, #"output-xml" : True
str("quiet"): True,
str("show-errors"): 0,
str("force-output"): True,
str("numeric-entities"): True,
str("show-warnings"): False,
str("input-encoding"): inputEncoding,
str("output-encoding"): "utf8",
str("indent"): False,
str("tidy-mark"): False,
str("wrap"): 0
};
document, errors = tidylib.tidy_document(html, options=options)
Aquí es un ejemplo de la limpieza de HTML usando el módulo lxml.html.clean.Cleaner:
import sys
from lxml.html.clean import Cleaner
def sanitize(dirty_html):
cleaner = Cleaner(page_structure=True,
meta=True,
embedded=True,
links=True,
style=True,
processing_instructions=True,
inline_style=True,
scripts=True,
javascript=True,
comments=True,
frames=True,
forms=True,
annoying_tags=True,
remove_unknown_tags=True,
safe_attrs_only=True,
safe_attrs=frozenset(['src','color', 'href', 'title', 'class', 'name', 'id']),
remove_tags=('span', 'font', 'div')
)
return cleaner.clean_html(dirty_html)
if __name__ == '__main__':
with open(sys.argv[1]) as fin:
print(sanitize(fin.read()))
Mira la docs para obtener una lista completa de opciones que puede pasar al limpiador.
- 1. ¿Limpiar el feo código HTML WYSIWYG? Utilidad Python o * nix
- 2. cómo limpiar microsoft html doc?
- 3. Limpiar HTML de usuario en .net
- 4. Limpiar HTML en texto de HtmlCleaner
- 5. Limpiar expresiones regulares de Python
- 6. ¿Limpiar el contenido formateado en HTML para visualizarlo en Flash?
- 7. Necesito un prettificador HTML basado en Java para limpiar el HTML generado por Velocity
- 8. Conversión por lotes de docx para limpiar HTML
- 9. Analizando HTML en Python
- 10. Descargar html en python?
- 11. Ejecutar script durante Limpiar/Limpiar todo en Xcode
- 12. Extraer y limpiar fragmento de HTML utilizando el analizador HTML (org.htmlparser)
- 13. Jsoup - ¿Cómo limpiar html escapando no eliminando el html no deseado?
- 14. Cómo limpiar mi instalación de Python para un nuevo comienzo
- 15. ¿Cómo puedo limpiar correctamente un objeto de Python?
- 16. Validar (X) HTML en Python
- 17. Truncamiento de HTML en Python
- 18. Plantilla HTML simple en Python
- 19. HTML Tag Cloud en Python
- 20. Limpiar un diseño en Qt
- 21. Limpiar la cadena en java
- 22. ¿Limpiar o no limpiar el directorio $ JBOSS_HOME/server/web/tmp?
- 23. XCode 4 "Limpiar" vs. "Limpiar carpeta de compilación"
- 24. Python refresh HTML document
- 25. Python y HTML '% Operator'
- 26. python html generator
- 27. Limpiar texto RTF
- 28. ¿Puedo limpiar el repl?
- 29. Limpiar la función Clojure
- 30. Limpiar proyecto basado
¿Alguna de estas respuestas era la que estaba buscando? Si necesita más información, podemos ayudarlo. – JudoWill
@JudoWill: Sí, pude configurar BeautifulSoup y Tidy. Desafortunadamente no estaban captando muchos de los problemas que estaba teniendo. Terminé construyendo mi propia función para pasar por el DOM y solucionar los problemas. ¡Gracias por la ayuda! – Joel
Podría publicar su propia función como respuesta. Este es un problema que tengo mucho tiempo y siempre estoy buscando nuevas soluciones. :) – JudoWill