如何使用genshi.builder程序化构建HTML文档?
我最近发现了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')
生成的页面不会有空白——看起来是正常的,但你会发现源代码很难阅读,因为它会全部在一行上。添加适当的过滤器来增加空白留给读者自己去实现。