【问题标题】:How do I use genshi.builder to programmatically build an HTML document?如何使用 genshi.builder 以编程方式构建 HTML 文档?
【发布时间】:2008-09-21 23:37:58
【问题描述】:

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

【问题讨论】:

    标签: python html templates genshi


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是有道理的。听起来像是你可以用来构建一个 html 片段以使用 ajax 或其他东西加载到页面中的东西?
    • 即使对于小型 AJAX 页面,我也更喜欢模板,因为它们往往只是简单的“如果登录,则显示名称”逻辑和参数替换。 builder.tag 用于当有一些非常复杂的东西我无法弄清楚如何用模板很好地编写时。
    【解决方案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__
    

    【讨论】:

    • 有没有办法使用 genshi 构建 html 文档?我正在寻找类似于 stan 的东西。如果这不是对 genshi 的适当使用,那很好,但我想知道是否是这种情况。
    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2018-12-11
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2011-03-14
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多