Python使用pyh生成HTML文檔的方法示例
最近在項目中需要將結(jié)果導出到HTML中,在網(wǎng)上搜索的時候發(fā)現(xiàn)了這個庫,通過官方的一些文檔以及網(wǎng)上的博客發(fā)現(xiàn)它的使用還是很簡單的,因此選擇在項目中使用它。
在使用的時候發(fā)現(xiàn)在Python3中有些問題,網(wǎng)上很多地方都沒有提到,因此我在這將它的使用以及我遇到的問題和解決方案整理出來供大家參考
本文主要參考 pyh中文文檔
下載的樣本也是該文中提到的地址
常規(guī)使用
在使用時一般先導入模塊:
from phy import *
然后可以創(chuàng)建一個PyH對象就像這樣
page = PyH(title)
其中title是一個字符串,這個字符串將作為頁面的標題顯示,也就是說此時產(chǎn)生的HTML代碼就是在頭部加上一個title標簽并將這個字符串作為文本值
然后我們可以addCSS方法或者addJS方法引入外部的js文件或者css文件(調(diào)用這兩個函數(shù)將在HTML的頭部產(chǎn)生一個引入的代碼,對于那種在body中添加style代碼的我暫時沒有找到什么辦法)
然后就是創(chuàng)建標簽對象,對應標簽類的名字所與在HTML中的對應的名稱相同,傳入對象的參數(shù)就是標簽中的屬性,除了class屬性對應的參數(shù)名稱是cl外,其余的參數(shù)名稱與在HTML中的屬性一一對應。比如我們要創(chuàng)建一個div標簽可以這樣寫
myDiv = div('測試div', id = 'div1', cl = "cls_div")
最終生成的HTML代碼如下:
<div id = 'div1' class = 'cls_div'>測試div</div>
將元素加入某個元素中可以使用<<符號,該符號返回的是最后被包含的符號對象。比如這樣
div(id = 'div1') << p('測試' cl = 'p_tag')
這句代碼會返回p元素對應的對象,而生成的HTML代碼如下:
<div id = 'div1'> <p class = 'p_tag'>測試</p> </div>
當生成了合適的HTML文檔后可以使用printOut方法將其打印,也可以使用render函數(shù)返回對應的HTML代碼,以便我們進行存盤或者做進一步處理
上面只是簡單的做一下介紹,詳細的使用方法請參看上面提到的一篇文章,這上面寫的比較詳細。下面來通過一個例子代碼來說明我是如何處理一些出現(xiàn)的錯誤、做一些簡單的擴展,并大致看看里面的源代碼
例子
from pyh import *
import codecs
from xml.sax.saxutils import escape
WORD_WIDTH = 100
def create_base(table_title, page):
page.addCSS('base.css')
#展示信息的表
base_table = page << table(cl = 'diff', id = 'difflib_chg_to0__top', cellspacing = '0', cellpadding = '0', rules = 'groups')
for i in range(4):
base_table << colgroup()
#表頭
t_head = base_table << thead()
tr_tag = t_head << tr()
tr_tag << th(cl = 'diff_next') << br()
tr_tag << th(table_title, colspan = '2', cl = 'diff_header')
t_body = base_table << tbody()
return t_body
#寫入一行信息
def write_line(tr_tag, mark, data):
tr_tag << td(mark, cl = 'diff_header')
tr_tag << td(data)
def txt2html(title, table_title, ifile, ofile):
i_f = codecs.open(ifile, 'r',encoding='utf-8')
lines = i_f.read().splitlines()
i_f.close()
page = PyH(title)
t_body = create_base(table_title, page)
lineno = 1
for data in lines:
if len(data) >= WORD_WIDTH:
for i in range(len(data) // WORD_WIDTH + 1):
sub_data = data[WORD_WIDTH * i: min(WORD_WIDTH * (i + 1), len(data) - 1)]
if i == 0:
mark = str(lineno)
else:
mark = '>'
tr_tag = t_body << tr()
sub_data = escape(sub_data)
sub_data = sub_data.replace(" ", " ")
sub_data = sub_data.replace("\t", " ")
write_line(tr_tag, mark, sub_data)
else:
tr_tag = t_body << tr()
data = escape(data)
data = data.replace(" ", " ")
data = data.replace("\t", " ")
write_line(tr_tag, str(lineno), data)
lineno += 1
html = page.render()
o_f = codecs.open(ofile, 'w', encoding= 'utf-8')
o_f.write(html)
o_f.close()
這是一個將任意文本文件轉(zhuǎn)化為HTML文檔的例子,主要是在調(diào)用txt2html函數(shù),該函數(shù)有4個參數(shù),頁面的標題,展示文本內(nèi)容的表格的標題,輸入文件路徑,輸出文件路徑
同時做了一些簡單的處理,對原文檔中的每行進行標號,同時設置一行只顯示100個字符多余的進行換行,以便閱讀
最終打開生成的HTML大致如下:

在Python3環(huán)境下直接運行發(fā)現(xiàn)它報了一個錯誤:

在Python2中存在Unicode字符串和普通字符串的區(qū)別,但是在Python3中所有字符串都默認是Unicode的,它取消了關于Python2中unicode函數(shù),這里報錯主要是這個原因,因此我們定位到報錯的地方,將代碼進行修改,去掉unicode函數(shù)(在Python2中unicode函數(shù)需要傳入一個普通字符串,因此這里我們只需要去掉unicode函數(shù),保留原來的參數(shù)即可,對于進行字符號轉(zhuǎn)化的直接注釋或者改為pass即可
解決了unicode問題之后再次運行,又報了這樣一個錯誤

定位到對應代碼處,在原來的代碼位置有這么一段代碼:
def TagFactory(name):
class f(Tag):
tagname = name
f.__name__ = name
return f
thisModule = modules[__name__]
for t in tags:
setattr(thisModule, t, TagFactory(t))
從這段代碼上可以知道,每當我們通過對應名稱創(chuàng)建一個標簽時,會在tags里面里面尋找到對應的標簽,然后調(diào)用工廠方法生成一個對應的標簽,這個工廠方法生成的其實是一個Tag對象,并且所有HTML標簽都是這個Tag類,因此可以猜測如果要添加新的標簽對象,那么可以通過修改tags里面的值,我們加入對應的標簽值之后發(fā)現(xiàn)代碼可以運行了,至此問題都解決了。
其實這些錯誤都是Python2代碼移植到python3環(huán)境下常見的錯誤,至于它的源碼我沒怎么看太明白,主要是它生成標簽的這一塊,我也不知道為什么修改了tags之后就可以運行了,python類廠的概念我還是不太明白,看來要花時間好好補一下基礎內(nèi)容了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- python+jinja2實現(xiàn)接口數(shù)據(jù)批量生成工具
- Python的Flask框架標配模板引擎Jinja2的使用教程
- 為Python的Tornado框架配置使用Jinja2模板引擎的方法
- Python的Flask框架中的Jinja2模板引擎學習教程
- python解析html提取數(shù)據(jù),并生成word文檔實例解析
- python使用 HTMLTestRunner.py生成測試報告
- Python3實現(xiàn)抓取javascript動態(tài)生成的html網(wǎng)頁功能示例
- 在Python中使用CasperJS獲取JS渲染生成的HTML內(nèi)容的教程
- python 利用jinja2模板生成html代碼實例
相關文章
Python使用Tkinter?GUI實現(xiàn)輸入驗證功能
這篇文章主要介紹了Python中使用Tkinter?GUI實現(xiàn)輸入驗證,文中通過一個完整示例代碼給大家介紹Python?Tkinter?GUI輸入驗證功能,需要的朋友可以參考下2022-04-04
python實現(xiàn)自動獲取IP并發(fā)送到郵箱
這篇文章主要為大家詳細介紹了python實現(xiàn)自動獲取IP并發(fā)到郵箱,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
python-redis-lock實現(xiàn)鎖自動續(xù)期的源碼邏輯
這篇文章主要介紹了python-redis-lock實現(xiàn)鎖自動續(xù)期的源碼邏輯,其中用到了多線程threading、弱引用weakref和Lua腳本等相關知識,需要的朋友可以參考下2024-07-07
python+opencv+selenium自動化登錄郵箱并解決滑動驗證的問題
本文主要講解基于python+opencv+selenium自動化登錄郵箱并解決滑動驗證的問題,在這大家需要注意頁面元素定位及文本框和驗證碼的frame嵌套問題,感興趣的朋友一起看看吧2021-07-07

