2011-07-19 18 views
37

En python, ¿cuál es la forma más elegante de generar documentos HTML? Actualmente agregué manualmente todas las etiquetas a una cadena gigante y escribí eso en un archivo. ¿Hay una manera más elegante de hacer esto?Generación de documentos HTML en python

+2

posible duplicado de [generador html pitón] (http://stackoverflow.com/questions/1548474/python-html-generator). Si está generando XHTML, también considere usar una herramienta XML. – You

+0

Existen [varios sistemas de plantillas] (http://wiki.python.org/moin/Templating) disponibles para Python. ¿Es esto lo que estás buscando? –

Respuesta

4

Recomendaría usar xml.dom para hacer esto.

http://docs.python.org/library/xml.dom.html

Leer esta página de manual, que tiene métodos para la construcción de XML (y por lo tanto XHTML). Hace que todas las tareas XML sean mucho más sencillas, como agregar nodos secundarios, tipos de documentos, agregar atributos y crear nodos de texto. Esto debería poder asistirlo en la gran mayoría de las cosas que hará para crear HTML.

También es muy útil para analizar y procesar documentos xml existentes.

Esperanza esto ayuda

PS

Aquí hay un tutorial que debe ayudar con la aplicación de la sintaxis

http://www.postneo.com/projects/pyxml/

+1

HTML no es un subconjunto de XML. Si está utilizando una herramienta XML, generará XHTML, no HTML. – You

+0

@You Este es un punto justo voy a editar mi respuesta –

+1

Es una falta grave que Python no tiene un no-XML, HTML-específica (por ejemplo, tiene métodos como div (id = 'myid', otherattr =' .. . '), ul() etc) versión de esto como estándar (hay terceros). Perl y Ruby lo hacen. – JDonner

0

Sí, se están buscando .writelines archivos

Una secuencia generalmente es una lista o matriz. Así que ponga todas sus líneas en una lista o matriz. Y agréguelos a la función a continuación.

Asegúrese de quitar cualquier nuevas constantes de la línea de las cuerdas sólo para estar seguro

Python Documentation (search for file.writelines)

file.writelines (secuencia) Escribir una secuencia de cadenas en el archivo. La secuencia puede ser cualquier objeto iterable que produzca cadenas, generalmente una lista de cadenas. No hay valor de retorno (El nombre se pretende igualar readlines();. Writelines() no añade separadores de línea)

23

se recomienda usar uno de los muchos lenguajes de plantillas disponibles para Python, por ejemplo el built into Django (usted no tiene utilizar el resto de Django para usar su motor de plantillas): una consulta de Google debería proporcionarle muchas otras implementaciones de plantillas alternativas.

Me parece que aprender una biblioteca de plantillas ayuda de muchas maneras: cada vez que necesite generar un correo electrónico, página HTML, archivo de texto o similar, solo escriba una plantilla, cárguela con su biblioteca de plantillas, luego deje el código de plantilla crea el producto terminado.

Aquí hay algo de código simple para empezar:

#!/usr/bin/env python 

from django.template import Template, Context 
from django.conf import settings 
settings.configure() # We have to do this to use django templates standalone - see 
# http://stackoverflow.com/questions/98135/how-do-i-use-django-templates-without-the-rest-of-django 

# Our template. Could just as easily be stored in a separate file 
template = """ 
<html> 
<head> 
<title>Template {{ title }}</title> 
</head> 
<body> 
Body with {{ mystring }}. 
</body> 
</html> 
""" 

t = Template(template) 
c = Context({"title": "title from code", 
      "mystring":"string from code"}) 
print t.render(c) 

Es aún más sencillo si tiene plantillas en el disco - echa un vistazo a la función render_to_string que se pueden cargar plantillas de disco desde una lista predefinida de rutas de búsqueda, llenar con datos de un dictador y renderizado a una cadena - llamada de función todo en uno.

+4

Pensé en esto, pero no creo que sea exactamente lo que el OP está pidiendo. Parece que quieren construir el HTML en sí mediante programación, mientras que una plantilla supone que ya tienes el HTML, pero solo necesita completar algunas variables. –

+0

Suena más como si tuvieran el contenido listo, y luego necesitan pegar html alrededor del contenido. Esto es exactamente para lo que es un motor de plantillas. – Wilduck

+2

Además, si quiere un motor de plantillas como el de Django, use Jinja2. Es más rápido, más potente y es un proyecto independiente. http://jinja.pocoo.org/docs/ – Wilduck

26

Encuentro que yattag es la forma más elegante de hacerlo.

from yattag import Doc 

doc, tag, text = Doc().tagtext() 

with tag('html'): 
    with tag('body'): 
     with tag('p', id = 'main'): 
      text('some text') 
     with tag('a', href='/my-url'): 
      text('some link') 

result = doc.getvalue() 

Se lee como html, con el beneficio adicional de que no tiene que cerrar las etiquetas.

1

estoy usando el fragmento de código conocido como throw_out_your_templates para algunos de mis propios proyectos:

https://github.com/tavisrudd/throw_out_your_templates

https://bitbucket.org/tavisrudd/throw-out-your-templates/src

Por desgracia, no hay ningún paquete PyPI para ello y que no es parte de cualquier distribución ya que esto solo se entiende como una prueba de concepto. Tampoco pude encontrar a alguien que tomara el código y comencé a mantenerlo como un proyecto real. Sin embargo, creo que vale la pena intentarlo aunque signifique que debe enviar su propia copia de throw_out_your_templates.py con su código.

Similar a la sugerencia de usar yattag por John Smith Opcional, este módulo no requiere que aprenda ningún lenguaje de plantillas y también se asegura de que nunca olvide cerrar etiquetas o citar caracteres especiales. Todo queda escrito en Python. Aquí está un ejemplo de cómo se usa:

html(lang='en')[ 
    head[title['An example'], meta(charset='UTF-8')], 
    body(onload='func_with_esc_args(1, "bar")')[ 
     div['Escaped chars: ', '< ', u'>', '&'], 
     script(type='text/javascript')[ 
      'var lt_not_escaped = (1 < 2);', 
      '\nvar escaped_cdata_close = "]]>";', 
      '\nvar unescaped_ampersand = "&";' 
      ], 
     Comment(''' 
     not escaped "< & >" 
     escaped: "-->" 
     '''), 
     div['some encoded bytes and the equivalent unicode:', 
      '你好', unicode('你好', 'utf-8')], 
     safe_unicode('<b>My surrounding b tags are not escaped</b>'), 
     ] 
    ] 
0

Si usted está construyendo documentos HTML de lo que sugeriría el uso de un sistema de plantillas (como jinja2) como han sugerido otros. Si usted está en necesidad de alguna generación de bajo nivel de bits html (tal vez como una entrada a una de sus plantillas), entonces el paquete es un paquete xml.etree pitón estándar y podría encajar muy bien el proyecto de ley.

import sys 
from xml.etree import ElementTree as ET 

html = ET.Element('html') 
body = ET.Element('body') 
html.append(body) 
div = ET.Element('div', attrib={'class': 'foo'}) 
body.append(div) 
span = ET.Element('span', attrib={'class': 'bar'}) 
div.append(span) 
span.text = "Hello World" 


ET.ElementTree(html).write(sys.stdout, encoding='utf8', 
          method='html') 

imprime el siguiente:

<html><body><div class="foo"><span class="bar">Hello World</span></div></body></html> 
Cuestiones relacionadas