如何使用genshi.builder以编程方式构建HTML文档?

时间:2008-09-21 23:37:59

标签: python html templates genshi

我最近发现了genshi.builder模块。这让我想起了Divmod Nevow的Stan模块。如何使用genshi.builder.tag来构建具有特定doctype的HTML文档?或者这是一件好事吗?如果没有,那么正确的方式是什么?

2 个答案:

答案 0 :(得分:4)

仅使用genshi.builder.tag构建整个页面是不可能的 - 您需要对生成的流执行一些手术以插入doctype。此外,生成的代码看起来很恐怖。使用Genshi的推荐方法是使用单独的模板文件,从中生成流,然后将该流渲染为所需的输出类型。

当你需要在Python中生成简单标记时,

genshi.builder.tag非常有用,比如在构建表单或对输出进行某种逻辑大量修改时。

请参阅以下文档:

如果您确实只想使用builder.tag生成完整文档,则此(完全未经测试的)代码可能是一个很好的起点:

from itertools import chain
from genshi.core import DOCTYPE, Stream
from genshi.output import DocType
from genshi.builder import tag as t

# Build the page using `genshi.builder.tag`
page = t.html (t.head (t.title ("Hello world!")), t.body (t.div ("Body text")))

# Convert the page element into a stream
stream = page.generate ()

# Chain the page stream with a stream containing only an HTML4 doctype declaration
stream = Stream (chain ([(DOCTYPE, DocType.get ('html4'), None)], stream))

# Convert the stream to text using the "html" renderer (could also be xml, xhtml, text, etc)
text = stream.render ('html')

结果页面中没有空格 - 它看起来很正常,但是你会很难阅读源代码,因为它完全在一行上。实现适当的过滤器来添加空格是留给读者的练习。

答案 1 :(得分:2)

Genshi.builder用于“以编程方式生成标记流”[1]。我相信它的目的是作为模板语言的后端。您可能正在寻找用于生成整页的模板语言。

但是,您可以执行以下操作:

>>> import genshi.output
>>> genshi.output.DocType('html')
('html', '-//W3C//DTD HTML 4.01//EN', 'http://www.w3.org/TR/html4/strict.dtd')

请在此处查看其他文档:http://genshi.edgewall.org/wiki/ApiDocs/genshi.output#genshi.output:DocType

[1] genshi.builder.__doc__