• 【Python】生成html文档-使用dominate


    dominate 简介

    dominate是一个使用优雅的DOM API创建和操作HTML文档的Python库。使用它能非常简洁地编写纯Python的HTML页面,这消除了学习另一种模板语言的需要,利用Python更强大的特性。

    首先安装依赖:

    pip install dominate

    1个简单的小例:

    from dominate.tags import *
    h = html()
    
    with h.add(body()).add(div(id='content')):
        h1('Hello World!')
        p('This is my first html.')
        with table().add(tbody()):
            l=tr()
            l +=td('One')
            l.add(td('Two'))
            with l:
                td('Three')
    with open('test.html','w') as f:
        f.write(h.render())

    生成的Html 源码 如下:

     效果:

     分解:

    dominate 的最基本的特性为每个HTML标记构建了一个类。可以使用

    from dominate.tags import *

    导入所有html标记

    Root element: html
    Document metadata: head, title, base, link, meta, style,
    Scripting: script, noscript
    Sections: body, section, nav, article, aside, h1, h2, h3, h4, h5, h6, hgroup, header, footer, address
    Grouping content: p, hr, pre, blockquote, ol, ul, li, dl, dt, dd, figure, figcaption, div
    Text semantics: a, em, strong, small, s, q, dfn, abbr, time_, code, var, samp, kbd, sub, i, b, u, mark, ruby, rt, rp, bdo, span, br, wbr
    Edits: ins, del_
    Embedded content: img, iframe, embed, object_, param, video, audio, source, track, canvas, map_, area
    Tabular data: table, caption, colgroup, col, tbody, thead, tfoot, tr, td, th
    Forms: form, fieldset, legend, label, input_, button, select, datalist, optgroup, option, textarea, keygen, output, progress, meter
    Interactive elements: details, summary, command, menu, font
    Additional markup: comment

     用1个小例子来体会一下:

    print(html(body(h1('Hello, World!'))))

    输出:

    <html>
      <body>
        <h1>hello,world</h1>
      </body>
    </html>

    标记的属性

    dominate 还可以使用关键字参数将属性附加到标签上。大多数属性都是来自HTML规范的直接拷贝.
    class和for可以使用如下别名

    class: _class, cls, className, class_name
    for: _for, fr, htmlFor, html_for

    使用data_*代表定制HTML5数据属性。
    属性的声明有如下方式:

    例1:

    test=label('text',cls='classname anothername',fr='someinput')
    #输出结果
    <label class="classname anothername" for="someinput">text</label>

    例2:

    header=div('text')
    header['id']='header'
    print(header)
    <div id="header">text</div>

    如何生成复杂的文档结构

     通过使用+=操作符,如下:

    list = ul()
    for item in range(4):
        list += li('Item #', item)
    print(list)

    输出:

    <ul>
        <li>Item #0</li>
        <li>Item #1</li>
        <li>Item #2</li>
        <li>Item #3</li>
    </ul>

    通过add()方法:

    _html=html()
    _body=_html.add(body())
    header=_body.add(div(id='header'))
    content=_body.add(div(id='content'))
    footer=_body.add(div(id='footer'))
    print(_html)

    输出:

    <html>
      <body>
        <div id="header"></div>
        <div id="content"></div>
        <div id="footer"></div>
      </body>
    </html>

    访问内容和属性

    header=div()
    header['id']='header'
    print(header)

    输出

    <div id="header"></div>
    header=div('Test')
    header[0]='Hello World'
    print(header)

    输出

    <div>Hello World</div>

    渲染

    a=div(span('Hello World'))
    print(a.render())
    
    <div>
      <span>Hello World</span>
    </div>
    print(a.render(pretty=False))
    
    <div><span>Hello World</span></div>
    
    print(a.render(indent='	'))
    
    <div>
        <span>Hello World</span>
    </div>
    
    a=div(span('Hello World'),__pretty=False)
    print(a.render(xhtml=True))
    
    <div><span>Hello World</span></div>

    上下文管理器

    例子: 

    with h:
    ...     li('One')
    ...     li('Two')
    ...     li('Three')
    ... print(h)

    输出:

    <html>
      <li>One</li>
      <li>Two</li>
      <li>Three</li>
    </html>

    更复杂的例子见文章开头的例子。
    可以在with内加入attr(),用来使当前的标签加入属性,如:

    d=div()
    with d:
    ...     attr(id='header')
    ... print(d)

    输出:

    <div id="header"></div>

    装饰器

    @div(h2('Welcome'),cls='greeting')
    ... def greeting(name):
    ...     p('Hello %s' %name)
    ...     
    print(greeting('Bob'))

    输出:

    <div class="greeting">
      <h2>Welcome</h2>
      <p>Hello Bob</p>
    </div>

    创建文档

    创建一个新文档时,创建了基本的HTML标记结构。

    from dominate import document
    d = document()
    d +=h1('Hello,World!')
    d.body+=p('This is a paragraph.')
    print(d)

    输出:

    <!DOCTYPE html>
    <html>
      <head>
        <title>Dominate</title>
      </head>
      <body>
        <h1>Hello,World!</h1>
        <p>This is a paragraph.</p>
      </body>
    </html>

    还可以直接访问<title>, <head>, <body>

    d.head
    <dominate.tags.head at 1f60dddc8d0: 0 attributes, 1 child>
    d.title
    'Dominate'
    d.body
    <dominate.tags.body at 1f60dddc6d8: 0 attributes, 2 children>

     我的需求:

    我希望生成一个测试报告的html,然后将这段html以邮件内容的方式发送出去,这样在邮箱中看到的内容就是比较友好的了。 

    生成测试汇总:

    from dominate.tags import *
    h = html()
    
    datas= {'all':30,'success':20,'fail':1,'pass':3}
    with h.add(body()).add(div(id='content')):
        h1('接口自动化定期扫描,共有 6 个异常接口')
    
        with table(border='1').add(tbody()):
    
            # 生成报表头部
            with tr(align='center'):
                td(colspan="4").add('测试汇总')
    
            l = tr(align="center", bgcolor="#0080FF", style="color:white")
    
            l += td('全部')
            l += td('成功')
            l += td('失败')
            l += td('未验证')
    
            #插入表格数据
            l=tr(align='center')
            with l:
                td(datas['all'])
                td(datas['success'])
                td(datas['fail'])
                td(datas['pass'])
    
    print(h.render())

     结果:

    <html>
      <body>
        <div id="content">
          <h1>接口自动化定期扫描,共有 6 个异常接口</h1>
          <table border="1">
            <tbody>
              <tr align="center">
                <td colspan="4">测试汇总</td>
              </tr>
              <tr align="center" bgcolor="#0080FF" style="color:white">
                <td>全部</td>
                <td>成功</td>
                <td>失败</td>
                <td>未验证</td>
              </tr>
              <tr align="center">
                <td>30</td>
                <td>20</td>
                <td>1</td>
                <td>3</td>
              </tr>
            </tbody>
          </table>
        </div>
      </body>
    </html>

    效果:

     完整代码:

    from dominate.tags import *
        h = html()
    
        with h.add(body()).add(div(id='content')):
            h1('接口自动化定期扫描,共有 6 个异常接口')
            h2('其中2个状态异常,4个响应超时')
            with table(border='1').add(tbody()):
                # 生成报表头部
                with tr(align='center'):
                    td(colspan="4").add('测试汇总')
                l = tr(align="center", bgcolor="#0080FF", style="color:white")
    
                l += td('全部')
                l += td('成功')
                l += td('失败')
                l += td('未验证')
    
                # 插入表格数据
                l = tr(align='center')
                with l:
                    td(40)
                    td(23)
                    td(3)
                    td(2)
    
        with h.add(body()).add(div(id='content')):
            with table(border='1').add(tbody()):
                # 生成报表头部
                with tr(align='center'):
                    td(colspan="7").add('测试明细')
                l = tr(align="center", bgcolor="#0080FF", style="color:white")
    
                l += td('id')
                l += td('接口名称')
                l += td('状态')
                l += td('接口地址')
                l += td('返回值')
                l += td('负责人')
    
                # 插入表格数据
                l = tr(align='center')
                with l:
                    td(40)
                    td('消息获取二手房选房卡列表')
                    td(2001)
                    td('/appapi/message/v1/findexchange    ')
                    td('{"status":"204","msg":"无数据","isPC":1}')
                    td('李小明')
    
        with h.add(body()).add(div(id='content')):
            with table(border='1').add(tbody()):
                # 生成报表头部
                with tr(align='center'):
                    td(colspan="7").add('超时接口明细')
                l = tr(align="center", bgcolor="#0080FF", style="color:white")
    
                l += td('id')
                l += td('接口名称')
                l += td('接口地址')
                l += td('测试时间')
                l += td('响应时间')
    
                # 插入表格数据
                l = tr(align='center')
                with l:
                    td(40)
                    td('消息获取二手房选房卡列表')
                    td('/appapi/message/v1/findexchange    ')
                    td('2020-06-02 22:53:04')
                    td(2.31)
    
    print(h.render())
    View Code

    效果:

    参考文档:

    HTML报告:python利用dominate库生成静态网页

    python学习-生成HTML文件

    Python下生成HTML文档

  • 相关阅读:
    等宽字体的妙用-loading 点点点动画
    BFC块级格式上下文介绍
    css3 HSLA 颜色制造半透明效果
    css reset 代码
    CSS 文本截断方案
    CSS BEM 命名方式
    盒模型里的滚动条算什么?
    CSS 权重图
    纯 css column 布局实现瀑布流效果
    mysql 重新整理——sql 执行语句的顺序[五]
  • 原文地址:https://www.cnblogs.com/kaerxifa/p/13035376.html
Copyright © 2020-2023  润新知