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

时间:2020-03-06 14:31:06  来源:igfitidea点击:

我最近发现了genshi.builder模块。它使我想起了Divmod Nevow的Stan模块。一个人如何使用genshi.builder.tag来构建具有特定doctype的HTML文档?还是这甚至是一件好事?如果没有,正确的方法是什么?

解决方案

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__

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

" genshi.builder.tag"在需要从Python内部生成简单标记时(例如,在构建表单或者对输出进行某种逻辑上的大量修改时)最有用。

请参阅说明文件:

  • 创建和使用模板
  • 基于XML的模板语言
  • genshi.builderAPI文档

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

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