Python使用pyh產生HTML文檔的方法樣本,pythonpyh

來源:互聯網
上載者:User

Python使用pyh產生HTML文檔的方法樣本,pythonpyh

最近在項目中需要將結果匯出到HTML中,在網上搜尋的時候發現了這個庫,通過官方的一些文檔以及網上的部落格發現它的使用還是很簡單的,因此選擇在項目中使用它。

在使用的時候發現在Python3中有些問題,網上很多地方都沒有提到,因此我在這將它的使用以及我遇到的問題和解決方案整理出來供大家參考

本文主要參考 pyh中文文檔

下載的樣本也是該文中提到的地址

常規使用

在使用時一般先匯入模組:

from phy import *

然後可以建立一個PyH對象就像這樣

page = PyH(title)

其中title是一個字串,這個字串將作為頁面的標題顯示,也就是說此時產生的HTML代碼就是在頭部加上一個title標籤並將這個字串作為文本值

然後我們可以addCSS方法或者addJS方法引入外部的js檔案或者css檔案(調用這兩個函數將在HTML的頭部產生一個引入的代碼,對於那種在body中添加style代碼的我暫時沒有找到什麼辦法)

然後就是建立標籤對象,對應標籤類的名字所與在HTML中的對應的名稱相同,傳入對象的參數就是標籤中的屬性,除了class屬性對應的參數名稱是cl外,其餘的參數名稱與在HTML中的屬性一一對應。比如我們要建立一個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函數返回對應的HTML代碼,以便我們進行存檔或者做進一步處理

上面只是簡單的做一下介紹,詳細的使用方法請參看上面提到的一篇文章,這上面寫的比較詳細。下面來通過一個例子代碼來說明我是如何處理一些出現的錯誤、做一些簡單的擴充,並大致看看裡面的原始碼

例子

from pyh import *import codecsfrom xml.sax.saxutils import escapeWORD_WIDTH = 100def 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()

這是一個將任意文字檔轉化為HTML文檔的例子,主要是在調用txt2html函數,該函數有4個參數,頁面的標題,展示常值內容的表格的標題,輸入檔案路徑,輸出檔案路徑

同時做了一些簡單的處理,對原文檔中的每行進行標號,同時設定一行只顯示100個字元多餘的進行換行,以便閱讀

最終開啟產生的HTML大致如下:

在Python3環境下直接運行發現它報了一個錯誤:

在Python2中存在Unicode字串和一般字元串的區別,但是在Python3中所有字串都預設是Unicode的,它取消了關於Python2中unicode函數,這裡報錯主要是這個原因,因此我們定位到報錯的地方,將代碼進行修改,去掉unicode函數(在Python2中unicode函數需要傳入一個一般字元串,因此這裡我們只需要去掉unicode函數,保留原來的參數即可,對於進行字元號轉化的直接注釋或者改為pass即可

解決了unicode問題之後再次運行,又報了這樣一個錯誤

定位到對應代碼處,在原來的代碼位置有這麼一段代碼:

def TagFactory(name):  class f(Tag):    tagname = name  f.__name__ = name  return fthisModule = modules[__name__]for t in tags:  setattr(thisModule, t, TagFactory(t))

從這段代碼上可以知道,每當我們通過對應名稱建立一個標籤時,會在tags裡面裡面尋找到對應的標籤,然後調用Factory 方法產生一個對應的標籤,這個Factory 方法產生的其實是一個Tag對象,並且所有HTML標籤都是這個Tag類,因此可以猜測如果要添加新的標籤對象,那麼可以通過修改tags裡面的值,我們加入對應的標籤值之後發現代碼可以運行了,至此問題都解決了。

其實這些錯誤都是Python2代碼移植到python3環境下常見的錯誤,至於它的源碼我沒怎麼看太明白,主要是它產生標籤的這一塊,我也不知道為什麼修改了tags之後就可以運行了,python類廠的概念我還是不太明白,看來要花時間好好補一下基礎內容了。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.