首页 > 编程语言 >【Python】生成html文档-使用dominate

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

时间:2024-06-02 23:22:09浏览次数:29  
标签:Python header add html print td dominate div

原文地址:https://www.cnblogs.com/kaerxifa/p/13035376.html

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='\t'))

<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())
复制代码

效果:

 

 

参考文档:

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

python学习-生成HTML文件

Python下生成HTML文档

标签:Python,header,add,html,print,td,dominate,div
From: https://www.cnblogs.com/vPYer/p/18227815

相关文章

  • [ Python ] 常用运算符对应的魔法方法
    https://www.cnblogs.com/yeungchie/Python中的运算符丰富多样,它们可以分为多个类别,包括算术运算符、比较运算符、逻辑运算符、位运算符、身份运算符、成员运算符等。每个运算符都有其对应的魔法方法(也称为特殊方法或dunder方法,即双下划线方法),这些方法在特定情况下会被Python调用......
  • 利用PlugLink平台实现Python自动化办公
    利用PlugLink平台实现Python自动化办公自动化技术已经成为提升效率和减少人力成本的关键。特别是利用AI和Python语言的强大功能,企业可以实现高度定制化的自动化工作流程。PlugLink作为一个开源的办公自动化平台,正是为了满足这一需求而生。本文将通过一个具体的Python案例,介......
  • Python使用BeautifulSoup爬取人人影视的详情页面
    importrequests,jsonfrombs4importBeautifulSoupif__name__=='__main__':url="https://yyets.com/movies/201565/"headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537......
  • HTML 基础操作知识
    1.标题标签h1--h6,逐级缩小,双标记,属性:对其属性align         例:<h1align="center">学雷锋,为人民服务</h1>2.段落标签:p,双标记,属性:对其属性align         eg:<palign="right">记者:张三</p>3.分割线:hr,单标记,属性:color颜色,size粗细,width长短  ......
  • 【Python基础】循环语句(5073字)
    文章目录@[toc]什么是循环Python中的循环方式while循环格式示例运行过程应用while循环嵌套示例1示例2for循环格式示例内置函数range()的用法range(x)range(x,y)range(x,y,z)应用break与continuebreakwhile循环中的break未使用break使用breakfor循环中的breakc......
  • python基础(习题、资料)
    免费提取资料: 练习、资料免费提取。持续更新迅雷云盘https://pan.xunlei.com/s/VNz6kH1EXQtK8j-wwwz_c0k8A1?pwd=rj2x#本文为Python的进阶知识合辑,包括列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)四种基本数据结构的介绍和实战案例分析。1、列表的简介列表(List)是一种用......
  • 天津科技-Python程序设计基础-数据结构-5
    编写函数avg(a),统计并返回元组a中所有奇数元素的平均值。在主程序中,从键盘输入(以空格分隔)包含若干个元素(数量不固定)的数值元组,调用avg()函数,计算并输出元组中所有奇数元素的平均值(保留2位小数)。输入格式:tuple(map(int,input().split()))输出格式"平均值为{:.2f}".format()......
  • 天津科技-Python程序设计基础-循环结构-5
    编写函数f(m,n),计算并返回。在主程序中输入m和n,调用函数f(),计算并输出函数值。输入格式:=map(int,input().split())输出格式:"{}".format()例如:输入1020输出8426deff(m,n):total=0forxinrange(m,n+1):total+=3*x**2+4*x+1r......
  • itertools: 一个实用的Python库
    很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就先给大家介绍一个很Pythonic的Python系统库:itertools。itertools库迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大......
  • python自然语言处理实战:核心技术与算法 (涂铭,刘祥,刘树春)高清电子版pdf下载百度云
    书:pan.baidu.com/s/1rOoEvizAhkQyF8xScVh51w?pwd=8onw提取码:8onw我的阅读笔记:Python基础:为了进行NLP任务,首先需要掌握Python编程语言的基础知识。文本预处理:这包括文本清洗(如去除标点、停用词、特殊字符等)、文本分词(如中文分词)、文本向量化(如词袋模型、TF-IDF、Word2Vec等)。......