如何使用genshi.builder程序化构建HTML文档?

5 投票
2 回答
1632 浏览
提问于 2025-04-11 09:20

我最近发现了genshi.builder这个模块。它让我想起了Divmod Nevow的Stan模块。请问怎么用genshi.builder.tag来构建一个带有特定文档类型的HTML文档呢?这样做合适吗?如果不合适,那正确的方法是什么呢?

2 个回答

3

Genshi.builder 是用来“程序化生成标记流”的工具。我认为它的目的是作为模板语言的后端。你可能更想要的是用来生成整个页面的模板语言。

不过,你可以做以下事情:

>>> 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__
6

genshi.builder.tag 来构建整个页面是不太可能的——你需要对生成的内容进行一些处理,才能插入文档类型声明(doctype)。而且,生成的代码看起来会很糟糕。推荐的做法是使用一个单独的模板文件,从中生成内容流,然后把这个流渲染成你想要的输出格式。

genshi.builder.tag 主要适合在 Python 中生成简单的标记,比如在你构建表单或者进行一些复杂的逻辑处理时使用。

可以查看以下文档:

如果你真的想只用 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')

生成的页面不会有空白——看起来是正常的,但你会发现源代码很难阅读,因为它会全部在一行上。添加适当的过滤器来增加空白留给读者自己去实现。

撰写回答