Python语言PyH模块生成HTML文档使用说明

in #cn6 years ago (edited)

补充一下:这是原创。如果转载,我会特别注明,这是道德。

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>的描述,我们可以重写实现,增加一个就好了。

总结

至此,就基本上就可以用它干活了。由于代码较短,我也做了一些小修改,上述的示例和代码库中的原始版本可能会有微小差异,应该影响也不大。

另外,我准备在写一篇文档,对源码进行分析,这样也方便后来者理解代码并修改完善它。