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