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


Posted in Python onMarch 10, 2018

最近在项目中需要将结果导出到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类厂的概念我还是不太明白,看来要花时间好好补一下基础内容了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用正则表达式检测密码强度源码分享
Jun 11 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
视觉直观感受若干常用排序算法
Apr 13 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 Python
tensorflow获取变量维度信息
Mar 10 #Python
TensorFlow变量管理详解
Mar 10 #Python
TensorFlow神经网络优化策略学习
Mar 09 #Python
TensorFlow实现AutoEncoder自编码器
Mar 09 #Python
TensorFlow实现MLP多层感知机模型
Mar 09 #Python
TensorFlow实现Softmax回归模型
Mar 09 #Python
用python实现百度翻译的示例代码
Mar 09 #Python
You might like
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
php 魔术方法使用说明
2009/10/20 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
php类中private属性继承问题分析
2012/11/01 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Python中logging日志库实例详解
2020/02/19 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
24岁生日感言
2014/01/13 职场文书
幼儿园标语大全
2014/06/19 职场文书
药剂专业自荐书
2014/06/20 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书