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

笑而不语心自闲發表於2024-06-02

原文地址: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文件

相關文章