补充一下:这是原创。如果转载,我会特别注明,这是道德。
Python语言PyH模块生成HTML文档使用说明
PyH是什么?
PyH是Python语言的一个模块(不是自带的),用于生成HTML文件。不错,它只能生成HTML,并不能解析它。
PyH的特点
它最大的特点是开源,并且源码很短小,只有不到200行。这样,如果你有什么不满意的,可以自己修改它。
源码地址:https://github.com/hanxiaomax/pyh
正如你看到的,一个中国人(很大可能是),对它进行了修改完善,支持了Unicode和Python3。别看这个工程有很多文件,其实只有一个《pyh.py》文件才是源码。
这个源码工程里面,自带了一个中文手册,为加深印象,我又重新总结了一份。
PyH的使用
Tag对象
Tag就是HTML标签,也称之为HTML元素,形如<div><div/>
。
生成Tag对象
Tag标签通过同名函数来生成。例如:
<tag>
对应的函数就是tag()
。其实这个描述不够准确,它不是函数,而是一个对象,没错,tag()表示的一个Tag对象。示例:>>> mydiv = div() >>> mydiv.render() '<div></div>'
在这里,我要做一下评论,render函数不好,它打印了当前的tag对象,但是为什么不重载标准的
__str__
方法呢?这样可以减少记忆的负担。通过看源码,其实render还有一个参数,可以写入到一个文件中,这样也不好,一个函数应该做单一的事情,应该把返回字符串和写字符串分开来。
于是,我重构了代码,实现了
__str__
函数,于是可以使用下面的函数打印tag的结果。打印tag对象。如下所示:
>>> from pyh import * >>> a=div() >>> print(a) <div> </div> >>> str(a) '<div>\n\n</div>\n'
设置Tag属性
有两种方式,一种是生成Tag对象时作为参数传递,另外一种是生成Tag对象后修改和设置其attributes属性,因为attributes是一个字典,存放的就是tag的属性,其key是属性的名字,value就是属性的值。但是有一点需要特别注意,对于class属性,其key为cl,原因也比较容易理解。
方法1,如下示例:
>>> from pyh import * >>> a=div(b='b',c='c') >>> print(a) <div b="b" c="c"> </div>
方法2,如下示例:
>>> from pyh import * >>> a=div() >>> a.attributes['b']='b' >>> a.attributes['c']='c' >>> print(a) <div b="b" c="c"> </div>
需要注意的是,key是一个字符串,作为参数不需要加上引号,但是使用属性需要加上引号。
设置tag的文本内容
同tag属性的设置一样,也有两种方法,一种是作为构造函数的参数传递,一种使用追加符号<<
,如下面的示例。
方法1:作为构造函数的参数
>>> from pyh import * >>> a=div('a') >>> print(a) <div> a </div>
方法2:使用追加符号
>>> a=div() >>> a<<'test' >>> print(a) <div> test </div>
设置tag的子元素
tag的子元素,也就是子tag,HTML的子标签。与设置tag的内容基本上是一样的,如下示例。
方法1:作为构造函数的参数
>>> a=div(div('test1'),div('test2')) >>> print(a) <div> <div> test1 </div> <div> test2 </div> </div>
方法2:使用追加操作符
>>> a=div() >>> a<<div('test1') >>> a<<div('test2') >>> print(a) <div> <div> test1 </div> <div> test2 </div> </div>
设置tag的兄弟元素
这里的说法有些不准确,应该是设置当前tag的相邻的下一个元素,使用+
连接即可。如下示例。
>>> a=div(id='a')+div(id='b')+div(id='c')
>>> print(a)
<div id="a">
</div>
<div id="b">
</div>
<div id="c">
</div>
访问子元素
这个小结无关紧要,是可选的,但有时也可能用得着,所以还是描述一下吧。之前讲述了如何给tag添加子元素,如果要获取子元素,可以使用子元素的ID,如果子元素没有设置ID,则使用tag_001
等类似的字符串作为其ID,如下所示。
有元素ID的情况
>>> a=div(div(id='test')) >>> print(a.test) <div id="test"> </div>
没有元素ID的情况
>>> a=div(div(name='d1'),div(name='d2')) >>> print(a.div) <div name="d1"> </div> >>> print(a.div_001) <div name="d2"> </div>
使用PyH对象生成网页
上一章节讲述了核心的Tag对象,现在我们看看如何生成HTML网页。为什么放在Tag对象的后面来讲呢?因为PyH对象其实也是Tag对象,也不完全是,它继承自Tag对象。只不过增加了一些用于简化的特殊方法,其实没有这些方法也完全可以自己来生成。
生成网页框架
>>> a=PyH()
>>> print(a)
<html>
<head>
<title>
MyPyHPage
</title>
</head>
<body>
</body>
</html>
你会发现,这个网页框架少一个类似<!DOCTYPE html>
的描述,我们可以重写实现,增加一个就好了。
总结
至此,就基本上就可以用它干活了。由于代码较短,我也做了一些小修改,上述的示例和代码库中的原始版本可能会有微小差异,应该影响也不大。
另外,我准备在写一篇文档,对源码进行分析,这样也方便后来者理解代码并修改完善它。