最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年03月10日 08:47:11   作者:masimaro  
這篇文章主要介紹了Python使用pyh生成HTML文檔的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近在項(xiàng)目中需要將結(jié)果導(dǎo)出到HTML中,在網(wǎng)上搜索的時(shí)候發(fā)現(xiàn)了這個(gè)庫(kù),通過(guò)官方的一些文檔以及網(wǎng)上的博客發(fā)現(xiàn)它的使用還是很簡(jiǎn)單的,因此選擇在項(xiàng)目中使用它。

在使用的時(shí)候發(fā)現(xiàn)在Python3中有些問(wèn)題,網(wǎng)上很多地方都沒(méi)有提到,因此我在這將它的使用以及我遇到的問(wèn)題和解決方案整理出來(lái)供大家參考

本文主要參考 pyh中文文檔

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

常規(guī)使用

在使用時(shí)一般先導(dǎo)入模塊:

from phy import *

然后可以創(chuàng)建一個(gè)PyH對(duì)象就像這樣

page = PyH(title)

其中title是一個(gè)字符串,這個(gè)字符串將作為頁(yè)面的標(biāo)題顯示,也就是說(shuō)此時(shí)產(chǎn)生的HTML代碼就是在頭部加上一個(gè)title標(biāo)簽并將這個(gè)字符串作為文本值

然后我們可以addCSS方法或者addJS方法引入外部的js文件或者css文件(調(diào)用這兩個(gè)函數(shù)將在HTML的頭部產(chǎn)生一個(gè)引入的代碼,對(duì)于那種在body中添加style代碼的我暫時(shí)沒(méi)有找到什么辦法)

然后就是創(chuàng)建標(biāo)簽對(duì)象,對(duì)應(yīng)標(biāo)簽類(lèi)的名字所與在HTML中的對(duì)應(yīng)的名稱相同,傳入對(duì)象的參數(shù)就是標(biāo)簽中的屬性,除了class屬性對(duì)應(yīng)的參數(shù)名稱是cl外,其余的參數(shù)名稱與在HTML中的屬性一一對(duì)應(yīng)。比如我們要?jiǎng)?chuàng)建一個(gè)div標(biāo)簽可以這樣寫(xiě)

myDiv = div('測(cè)試div', id = 'div1', cl = "cls_div")

最終生成的HTML代碼如下:

<div id = 'div1' class = 'cls_div'>測(cè)試div</div>

將元素加入某個(gè)元素中可以使用<<符號(hào),該符號(hào)返回的是最后被包含的符號(hào)對(duì)象。比如這樣

div(id = 'div1') << p('測(cè)試' cl = 'p_tag')

這句代碼會(huì)返回p元素對(duì)應(yīng)的對(duì)象,而生成的HTML代碼如下:

<div id = 'div1'>
  <p class = 'p_tag'>測(cè)試</p>
</div>

當(dāng)生成了合適的HTML文檔后可以使用printOut方法將其打印,也可以使用render函數(shù)返回對(duì)應(yīng)的HTML代碼,以便我們進(jìn)行存盤(pán)或者做進(jìn)一步處理

上面只是簡(jiǎn)單的做一下介紹,詳細(xì)的使用方法請(qǐng)參看上面提到的一篇文章,這上面寫(xiě)的比較詳細(xì)。下面來(lái)通過(guò)一個(gè)例子代碼來(lái)說(shuō)明我是如何處理一些出現(xiàn)的錯(cuò)誤、做一些簡(jiǎn)單的擴(kuò)展,并大致看看里面的源代碼

例子

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

#寫(xiě)入一行信息
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()

這是一個(gè)將任意文本文件轉(zhuǎn)化為HTML文檔的例子,主要是在調(diào)用txt2html函數(shù),該函數(shù)有4個(gè)參數(shù),頁(yè)面的標(biāo)題,展示文本內(nèi)容的表格的標(biāo)題,輸入文件路徑,輸出文件路徑

同時(shí)做了一些簡(jiǎn)單的處理,對(duì)原文檔中的每行進(jìn)行標(biāo)號(hào),同時(shí)設(shè)置一行只顯示100個(gè)字符多余的進(jìn)行換行,以便閱讀

最終打開(kāi)生成的HTML大致如下:

在Python3環(huán)境下直接運(yùn)行發(fā)現(xiàn)它報(bào)了一個(gè)錯(cuò)誤:

在Python2中存在Unicode字符串和普通字符串的區(qū)別,但是在Python3中所有字符串都默認(rèn)是Unicode的,它取消了關(guān)于Python2中unicode函數(shù),這里報(bào)錯(cuò)主要是這個(gè)原因,因此我們定位到報(bào)錯(cuò)的地方,將代碼進(jìn)行修改,去掉unicode函數(shù)(在Python2中unicode函數(shù)需要傳入一個(gè)普通字符串,因此這里我們只需要去掉unicode函數(shù),保留原來(lái)的參數(shù)即可,對(duì)于進(jìn)行字符號(hào)轉(zhuǎn)化的直接注釋或者改為pass即可

解決了unicode問(wèn)題之后再次運(yùn)行,又報(bào)了這樣一個(gè)錯(cuò)誤

定位到對(duì)應(yīng)代碼處,在原來(lái)的代碼位置有這么一段代碼:

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

從這段代碼上可以知道,每當(dāng)我們通過(guò)對(duì)應(yīng)名稱創(chuàng)建一個(gè)標(biāo)簽時(shí),會(huì)在tags里面里面尋找到對(duì)應(yīng)的標(biāo)簽,然后調(diào)用工廠方法生成一個(gè)對(duì)應(yīng)的標(biāo)簽,這個(gè)工廠方法生成的其實(shí)是一個(gè)Tag對(duì)象,并且所有HTML標(biāo)簽都是這個(gè)Tag類(lèi),因此可以猜測(cè)如果要添加新的標(biāo)簽對(duì)象,那么可以通過(guò)修改tags里面的值,我們加入對(duì)應(yīng)的標(biāo)簽值之后發(fā)現(xiàn)代碼可以運(yùn)行了,至此問(wèn)題都解決了。

其實(shí)這些錯(cuò)誤都是Python2代碼移植到python3環(huán)境下常見(jiàn)的錯(cuò)誤,至于它的源碼我沒(méi)怎么看太明白,主要是它生成標(biāo)簽的這一塊,我也不知道為什么修改了tags之后就可以運(yùn)行了,python類(lèi)廠的概念我還是不太明白,看來(lái)要花時(shí)間好好補(bǔ)一下基礎(chǔ)內(nèi)容了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

新化县| 海南省| 祥云县| 怀柔区| 攀枝花市| 平和县| 华阴市| 包头市| 周至县| 丰台区| 盖州市| 淮安市| 宿迁市| 利津县| 昌都县| 富宁县| 宜君县| 阳新县| 德阳市| 雅安市| 孟津县| 博兴县| 晋江市| 松原市| 天津市| 莲花县| 大石桥市| 舟山市| 安平县| 辛集市| 新安县| 安西县| 望谟县| 义乌市| 五指山市| 鸡泽县| 阜平县| 九龙坡区| 望江县| 莎车县| 鲁山县|