中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python使用pyh生成HTML文檔的方法示例

發布時間:2020-09-27 12:25:14 來源:腳本之家 閱讀:138 作者:masimaro 欄目:開發技術

最近在項目中需要將結果導出到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 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()

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

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

最終打開生成的HTML大致如下:

Python使用pyh生成HTML文檔的方法示例

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

Python使用pyh生成HTML文檔的方法示例

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

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

Python使用pyh生成HTML文檔的方法示例

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

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))

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新巴尔虎右旗| 宜州市| 虎林市| 社旗县| 微山县| 仙桃市| 同仁县| 元江| 桂林市| 上林县| 肥东县| 穆棱市| 广饶县| 中宁县| 固镇县| 文山县| 磐石市| 彭州市| 伊宁县| 伊春市| 崇明县| 定陶县| 阆中市| 榆中县| 五指山市| 长春市| 淮北市| 新昌县| 南部县| 蓝田县| 云南省| 荥经县| 巩义市| 安溪县| 北安市| 杂多县| 吴忠市| 堆龙德庆县| 华宁县| 铁岭市| 富源县|