在Python中生成HTML文档

在python中,生成HTML文档的最优雅的方法是什么? 我目前手动将所有的标签附加到一个巨大的string,并将其写入一个文件。 有没有更好的方法来做到这一点?

我会build议使用Python中可用的许多模板语言之一,例如Django中内置的模板语言之一(您不必使用Django的其余部分使用其模板引擎) – 谷歌查询应该给你很多其他的select模板实现。

我发现学习模板库有很多方面的帮助 – 无论何时您需要生成电子邮件,HTML页面,文本文件或类似内容,您只需编写一个模板,使用模板库加载它,然后让模板代码创build成品。

这里有一些简单的代码来帮助你开始:

#!/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) 

如果你在磁盘上有模板,就更简单了 – 检查一下render_to_string函数,它可以从预定义的searchpath列表中加载模板,填充数据,渲染到string – 全部在一个函数调用中。

我发现yattag是做这件事的最优雅的方式。

 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() 

它看起来像html,还有额外的好处,你不必closures标签。

我会build议使用xml.dom来做到这一点。

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

阅读本手册页,它具有build立XML(因此XHTML)的方法。 它使所有的XML任务变得更容易,包括添加子节点,文档types,添加属性,创build文本节点。 这应该能够帮助你在绝大多数你将要做的事情来创buildHTML。

这对分析和处理现有的XML文档也非常有用。

希望这可以帮助

PS

这里是一个教程,应该帮助你应用语法

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

我为我自己的一些项目使用了称为throw_out_your_templates的代码片段:

https://github.com/tavisrudd/throw_out_your_templates

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

不幸的是,它没有pypi包,它不是任何分配的一部分,因为这只是一个概念validation。 我也无法find代码,并开始维护它作为一个实际的项目。 尽pipe如此,我认为这是值得一试的,即使这意味着您必须将您自己的throw_out_your_templates.py副本与您的代码一起发送。

与John Smithselect使用yattag的build议类似,该模块不需要您学习任何模板语言,并且确保您永远不会忘记closures标签或引用特殊字符。 一切都是用Python编写的。 这是一个如何使用它的例子:

 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>'), ] ] 

是的,你正在寻找文件打印

一个序列通常是一个列表或数组。 所以把你所有的行放入一个列表或数组中。 并把它们扔到下面的function。

确保从string中删除任何新的行常量,以确保安全

Python文档(searchfile.writelines)

file.writelines(sequence)将一串string写入文件。 序列可以是任何可生成string的可迭代对象,通常是string列表。 没有返回值。 (该名称旨在匹配readlines(); writelines()不添加行分隔符。)