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环境安装教程
Jul 13 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
python实现将汉字保存成文本的方法
Nov 16 Python
总结python中pass的作用
Feb 27 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
Python音乐爬虫完美绕过反爬
Aug 30 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
ajax 的post方法实例(带循环)
2011/07/04 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python实现的科学计算器功能示例
2017/08/04 Python
Python学习之用pygal画世界地图实例
2017/12/07 Python
Python中的整除和取模实例
2020/06/03 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
试述DBMS的主要功能
2016/11/13 面试题
2014端午节活动策划方案
2014/01/27 职场文书
小学数学教学反思
2014/02/02 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
处罚决定书范文
2015/06/24 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript