原文地址: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())
效果:
參考文件: