| You are here: Inicio > Inmersión en Python > Procesamiento de HTML > Poner comillas a los valores de los atributos | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Una pregunta habitual en comp.lang.python es “Tengo unos documentos HTML con valores de atributos sin comillas, y quiero corregirlos todos. ¿Cómo puedo hacerlo?”[9] (Generalmente sucede cuando un jefe de proyecto que ha abrazado la religión HTML-es-un-estándar se une a un proyecto y proclama que todas las páginas deben pasar el validador de HTML. Los valores de atributos sin comillas son una violación habitual del estándar HTML). Cualquiera que sea la razón, es fácil corregir el problema de los valores de atributo sin comillas alimentando a BaseHTMLProcessor con HTML.
BaseHTMLProcessor consume HTML (ya que desciende de SGMLParser) y produce HTML equivalente, pero la salida no es idéntica a la entrada. Las etiquetas y los nombres de atributos terminarán en minúscula, incluso si al principio estaban en mayúscula o todo mezclado, y los valores de los atributos estarán entre comillas dobles, incluso si estaban entre comillas simples, o sin comillas. Es éste último efecto secundario el que podemos aprovechar.
>>> htmlSource = """... <html> ... <head> ... <title>Test page</title> ... </head> ... <body> ... <ul> ... <li><a href=index.html>Home</a></li> ... <li><a href=toc.html>Table of contents</a></li> ... <li><a href=history.html>Revision history</a></li> ... </body> ... </html> ... """ >>> from BaseHTMLProcessor import BaseHTMLProcessor >>> parser = BaseHTMLProcessor() >>> parser.feed(htmlSource)
>>> print parser.output()
<html> <head> <title>Test page</title> </head> <body> <ul> <li><a href="index.html">Home</a></li> <li><a href="toc.html">Table of contents</a></li> <li><a href="history.html">Revision history</a></li> </body> </html>
| Observe que los valores de los atributos href de las etiquetas <a> no tienen las comillas adecuadas. (Advierta también que está usando comillas triples para algo diferente a una cadena de documentación. Y directamente en el IDE, nada menos. Son muy útiles). | |
| Alimentar al analizador. | |
| Usando la función output definida en BaseHTMLProcessor obtenemos la salida como una única cadena, completa con comillas en los valores sus atributos. Aunque esto pueda parecer anticlimático, piense sobre todo lo que ha sucedido aquí: SGMLParser analizó el documento HTML entero, reduciéndolo a etiquetas, referencias, datos, etc.; BaseHTMLProcessor usó esos elementos para reconstruir las partes de HTML (que aún están almacenadas en parser.pieces, por si quiere verlas); y por último, ha llamado a parser.output, que juntó todas las partes del HTML en una única cadena. |
[9] Vale, no es una pregunta tan frecuente. No se acerca a “¿Qué editor debería usar para escribir código de Python?” (respuesta: Emacs - el traductor disiente) o “¿Python es mejor o peor que Perl?” (respuesta: “Perl es peor que Python porque la gente quiere que sea peor.” -Larry Wall, 10/14/1998) Pero aparecen preguntas sobre procesamiento de HTML de una u otra forma una vez al mes, y entre estas preguntas, esta es bastante popular.
<< Cadenas de formato basadas en diccionarios |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
Presentación de dialect.py >> |