Python寫靜態HTML

2021-02-13 子由錄

背景

因為近期工作需要,常常要將測試結果/數據統計、匯總和展示,因此會有寫靜態HTML的需求,本文記錄下python寫靜態HTML的小技巧

靈感

靈感時來源於unittest測試框架最常用的報告插件:HTMLTestRunner,該插件本身基於python2且已經更新了,好在@蟲師一直在維護和更新這個插件,使得它能繼續被大家所使用,了解詳情請移步:SeldomQA/HTMLTestRunner

回到HTMLTestRunner報告插件,閱讀源碼發現,作者只用了一個python文件便巧妙的將寫HTML、頁面繪製和數據嵌入搞定了。進一步分析可以看到,作者先是在Template基類中定義了測試報告的HTML結構模板和各個模塊/表格模板,然後再以格式化輸入的形式給每一個模板中填充目標數據,再將填充好的模板以格式化輸入的形式填充到HTML結構模板中,最後再將所有內容寫成一個HTML文件即可。

class Template_mixin(object):
"""
Define a HTML template for report customerization and generation.
Overall structure of an HTML report
HTML
+----+
|<html> |
| <head> |
| |
| STYLESHEET |
| +-+ |
| | | |
| +-+ |
| |
| </head> |
| |
| <body> |
| |
| HEADING |
| +-+ |
| | | |
| +-+ |
| |
| REPORT |
| +-+ |
| | | |
| +-+ |
| |
| ENDING |
| +-+ |
| | | |
| +-+ |
| |
| </body> |
|</html> |
+----+
"""

可以看到,這樣的設計其實優點在於非常小巧和輕量,缺點在於可維護和可移植性差,數據量小還尚可,不太適合大量數據的統計和繪製。

技巧

這種設計的關鍵在於建模板,然後按需填充數據,最後再寫HTML,通常我的做法是:

網上找到想要的頁面或著表格,copy其HTML結構,將變動的部分(需要動態填充數據的部分)提取出來,並用格式化輸入形式替代,如:%(style)s, %(rows)s

HTML_TMPL = r"""
<!DOCTYPE html>
<html lang="en">
<head>
<title>Overview</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
%(style)s
</head>
<body>
<h1> 總覽 </h1>
<table>
<thead>
<tr>
<th>#</th>
<th>設備</th>
<th>環境</th>
<th>耗時</th>
<th>結果</th>
<th>統計</th>
<th>報告</th>
</tr>
</thead>
<tbody>
<tr>
%(rows)s
</tr>
<tr>
%(total)s
</tr>
</tbody>
</table>
</body>
</html>
""" # style, rows, total

將變動的部分單拎出來,形成模板,依然用格式化輸入形式替代

TBODY_TOTAL_TMPL = """
<tr>
<th> 合計 </th>
<th colspan="6"> 通過率: {passing_rate}% &nbsp;&nbsp; 失敗率: {failure_rate}%
&nbsp;&nbsp; 錯誤率: {error_rate}% &nbsp;&nbsp; 跳過率: {skip_rate}% </th>
</tr>
"""

按照模板格式,組裝數據並填充

total += TBODY_TOTAL_TMPL.format(
passing_rate=np.mean(p_rates).round(2),
failure_rate=np.mean(f_rates).round(2),
error_rate=np.mean(e_rates).round(2),
skip_rate=np.mean(s_rates).round(2))

最後將所有數據填充到主模板,並寫HTML

# write reporter
with open(filepath, 'w', encoding='utf-8') as wf:
wf.write(HTML_TMPL % dict(rows=rows, total=total, style=STYLE_TMPL))

擴展

相關焦點

  • 計算機畢業設計中用HTML網頁調用本地Python程序
    一、編寫你的python代碼我們就先寫一個簡單的吧(這個能讓你很容易地看到效果),命名為test2.py,寫入代碼:import osfile = open('new_file' + '.txt','w')file.close()注意:這一步在測試1中不用 二、編寫你的HTML
  • Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?
    Pylint 主要的功能就是用於編碼風格的檢驗,在默認情況下 Pylint 會以 PEP-8為標準,如果你寫的代碼不符合 PEP-8編碼規範,它就會給你報錯。如下圖所示:Pyflakes: 代碼邏輯和語法檢查如果你使用的 Vim 或者記事本來寫代碼,那麼可以用 Pyflakes 來檢查代碼是不是有語法錯誤或者邏輯錯誤。
  • Python——用 Django 寫 restful api 接口
    用 Python 如何寫一個接口呢,首先得要有數據,可以用我們在網站上爬的數據,在上一篇文章中寫了如何用 Python 爬蟲,有興趣的可以看看:https://www.cnblogs.com/sixrain/p/9120529.html大量的數據保存到資料庫比較方便。
  • 求職者如何利用Neocities永久免費靜態HTML空間搭建個人簡歷網站
    我是個雖然自己寫程序不好,但喜歡喜歡倒騰代碼的人,因此經常要用很多網站空間又沒有多少錢於是找免費空間就是我經常做的事,在這個類目下將分享我使用的免費空間,比如今天介紹的給求職者如何利用Neocities免費靜態空間搭建個人簡歷網站,特別適用需要展示自己作品案例的簡歷,比如設計類的,
  • Python Sphinx 生成簡潔大方的文檔
    的第三方庫,它允許程式設計師以純文本格式編寫文檔,Spninx 可以輕鬆生成各種格式的輸出,比如 html,pfd,等等。程式設計師最討厭的兩件事:正經寫文檔確實麻煩,為啥麻煩呢?因為很長時間程式設計師寫代碼和寫文檔是完全獨立分開的,這說起來就是兩份工作量,最不能忍受的還是變化帶來的負擔,代碼是可能經常變動的,代碼變動之後,含義自然就可能不一樣,或者新加了了功能,文檔如果還要手動跟進的話,最喜歡偷懶的程式設計師自然就不願了。我們回歸本源,程式設計師這討厭的兩件事說明了什麼?
  • Python爬蟲html解析,還在用BeautifulSoup嗎?試試PyQuery吧
    在初學python時,大家都喜歡寫些小腳本來爬些網頁,因為這能在最短的時間讓我們達到一種小小的滿足感,通常我們解析網頁時有幾種方法:正則表達式匹配 - 比較低級用beautifulsoup、pyquery等包解析用scrapy、pyspider等框架來解析其實,方法
  • HTML .html 文件原始碼快速排版工具 規範化標準格式化 靜態網站
    由於 HTML4 HTML5 程式語言對編寫 .htm .html 格式 Web 文件的要求並不嚴格 ,因此,就會產生各種排版形式或打亂原始碼的靜態、動態網站源文件。經此小程序排版 (或稱規範化、標準化、格式化) 後的 .htm .html 格式源文件,可用於靜態動態 Web 網站開發、Web 文檔翻譯、高效批處理、可控數位化、大數據、AI (人工智慧)、等應用場景。
  • Python每天一分鐘:實例方法、靜態方法、類方法詳解(附代碼)
    python類編程三大方法Python實例方法在類編程中,一般情況下在類中定義的方法/函數默認都是實例方法。我們以下圖中的代碼來詳細說明:實例方法python的類編程中實例方法最大的特點就是最少要包含一個 self 參數,該self參數的作用是綁定調用此方法的實例對象,如上述代碼中的self參數便是指向實例myhouse,類比C++中的this指針。
  • 零基礎html5+div+css+js網頁開發教程第003期 html代碼基本結構
    三、寫網頁代碼的注意事項注意1、Html代碼基本結構是不能亂的,不然會出現意想不到的效果2、代碼的書寫一定要有層次感,這個是編程中都有的一些規定3、網頁的標題顯示一定要寫在<head>標籤中4、<html><head><body>這三個標籤,一張網頁只能出現一次,表示一張網頁的html代碼結構5、網頁設置的編碼格式要與文件的編碼格式保持一致,不然會出現亂碼,推薦使用Utf-8
  • Python學習第224課——html表單
    上節我們學習了a標籤,通過它可以把網際網路上的各個網頁連接起來,點擊超連結可以跳轉到一個新的網頁,也就是說,通過超連結我們可以在靜態網頁上進行簡單的交互。這節我們學習html中另一個具有交互作用的元素--表單。
  • Python 數據處理(十八)—— HTML 表格
    html 表格。>render_links 參數提供了向包含 url 的單元格添加超連結的能力In [310]: url_df = pd.DataFrame(   :     {   :         "name": ["Python", "pandas"],   :         "url": ["https://www.python.org
  • 工具 很全的 Python 面試題
    因為實例方法的調用離不開實例,我們需要把實例自己傳給函數,調用的時候是這樣的a.foo(x)(其實是foo(a, x)).類方法一樣,只不過它傳遞的是類而不是實例,A.class_foo(x).注意這裡的self和cls可以替換別的參數,但是python的約定是這倆,還是不要改的好.對於靜態方法其實和普通的方法一樣,不需要對誰進行綁定,唯一的區別是調用的時候需要使用a.static_foo(x)或者
  • Python奇技淫巧你知道多少?
    一行作判斷當條件滿足時, 返回的為等號後面的變量, 否則返回else後語句裝飾器之單例staticmethod裝飾器classmethod裝飾器, 類方法(給人感覺非常類似於OC中的類方法), 其中第一個隱式參數為類staticmethod裝飾器, 沒有任何隱式參數. python
  • 如何用 Python 解析 HTML | Linux 中國
    /usr/bin/env python# -*- coding: utf-8  -*-# sortlist.pyimport osimagelist = []for line in open('/tmp/imagelist_parse4.txt').xreadlines():    imagelist.append(
  • 「技術文章」《Python 資料庫 GUI CGI編程》
    1.寫在前邊上一次,我們介紹了Python的入門的文章,今天我們就來介紹下Python的資料庫,GUI, CGI的編程,以及Python 2.x 與Python 3.x的區別。2.連接資料庫 Python 標準資料庫接口為 Python DB-API,MySQLdb 是用於Python連結Mysql資料庫的接口。
  • 用 Python 寫一個安卓 APP
    APP 肯定不是最好的選擇,目前用Java和 kotlin 寫的居多,但是肯定也是一個很偷懶的選擇,而且實在不想學習 Java,再者,就編程而言已經會的就 Python與Golang(註:Python,Golang水平都一般),那麼久Google了一下Python 寫安卓的 APP 的可能性,還真行。
  • 科悟學院講解Python是什麼以及Python的應用
    1.1.編譯和解釋型語言的區別CPU不能直接認識並執行我們寫的語句,它只能認識機器語言(CPU指令集;二進位的形式);因此我們開發語言的Virtual Machine要將識別的開發語言轉換成機器語言讓CPU去執行;那麼就有兩種以下兩種方式:編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進位文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快
  • Python爬蟲基礎:常用HTML標籤和Javascript入門
    例如,把下面的代碼保存為index.html文件並使用瀏覽器打開,單擊按鈕「保存」,網頁會彈出提示「保存成功」。;</html>對於較多但僅在個別網頁中用到的JavaScript代碼,可以寫在網頁中的<script>標籤中。
  • HTMLHint v0.9.1 發布 靜態掃描組件
    HTMLHint是一款基於JS開發的靜態掃描組件,支持所有瀏覽器和Nodejs平臺,可以集成到IDE環境或編譯系統中。官方網站:http://htmlhint.com/軟體開發背景: 近一段時間一直在負責公司質量方面工作 團隊質量情況不是很樂觀,本人之前就出過標籤未閉合造成的線上故障 業界中JS有JSHint,CSS有CSSLint,但是HTML沒有比較靠譜的方案 基於上面一些背景原因,業餘時間開發了HTMLHint。
  • Python 性能優化
    (點擊上方藍字,快速關注我們)來源:xybabywww.cnblogs.com/xybaby/p/6510941.html