Masimaro's blog - pyh
type: channel
link: https://www.masimaro.top/tag/pyh/
items: 使用pyh生成HTML文档

使用pyh生成HTML文档
type: item
date: 2018-03-09T13:53:00+08:00
description: 最近在项目中需要将结果导出到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 将元素加入某个元素中可以使用<<符号，该符号返回的是最后被包含的符号对象。比如这样div(id = 'div1') << p('测试' cl = 'p_tag')这句代码会返回p元素对应的对象，而生成的HTML代码如下： 测试 当生成了合适的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.replac…