怎么说呢,python可以算是救了我一命的一门语言,若不是他,恐怕公司的这个项目还遥遥无期,我会始终保有对他最崇高的敬意。
这里,我仅列出自己最近使用的几个库,并简单演示一下其高超的使用效率。
1.jinja2
简介:一个模板替换类,衍生于django的Template,在很多地方做了加强。
中文支持:模板文件的内容以及render传入的数据,如果含有多字节编码,则必须要先进行decode,渲染之后的结果也是经过decode的。
备注:jinja2在renderXML等格式的文件的时候,不会自动替换html标签,这点有时候是好事~~,因为我并不用jinjia直接来往前台吐页面。
使用:
使用方法很简单:

1
2
3
from jinja2 import Template
template = Template('Hello {{ name }}!')
print template.render(name='World')

也支持不定函数变量的传递:

1
2
3
4
5
6
7
8
9
10
11
12
from jinja2 import Template
template = Template('''
    {{ name }}!
    {%if test0 > 8%}{{test1}} is larger ! {%endif%}
    {%if test1 > 8%}{{test1}} is larger ! {%endif%}
    {%if test2 > 8%}{{test2}} is larger ! {%endif%}
        ''')
alls = [8,9,10]
mapAll = {}
for i, ch in enumerate(alls):
    mapAll["test"+str(i)] = ch
print template.render(name='Hello!',**mapAll)

输出为:

Hello!!
9 is larger !
10 is larger !

2.simplejson/自带json
简介:一个把python数据结构和json互相转化的类
中文支持:
支持,但是当需要dumps的数据中含有unicode字符的时候,需要指定ensure_ascii = False,如下:

1
outdata = simplejson.dumps(pydata,ensure_ascii = False)

在dumps的时候,无论obj是否进行了decode都可以,但是当loads之后,则字符串一定被自动decode了
备注:无
使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import json
 
def main(x):
    str_data = json.dumps(x,ensure_ascii=False)
    print repr(str_data)
 
    y = json.loads(str_data)
    print repr(y)
 
if __name__ == '__main__':
    x = {
        'ret' : 1,
        'msg' : '试试'
    }
    main(x)
 
    x['msg'] = u'试试'
    main(x)

输出结果如下:

'{"msg": "\xe8\xaf\x95\xe8\xaf\x95", "ret": 1}'
{u'msg': u'\u8bd5\u8bd5', u'ret': 1}
u'{"msg": "\u8bd5\u8bd5", "ret": 1}'
{u'msg': u'\u8bd5\u8bd5', u'ret': 1}

3.BeautifulSoup
简介:一个非常与众不同的解析HTML/XML的类库,用起来非常快捷,方便
中文支持:很好,在soup里面拿到的中文都是经过decode过的
备注:本博的糗事百科的vim插件就是用它来解析的html
使用:
假设待解析的数据如下(存在data中):

1
2
3
4
5
6
7
8
9
10
11
12
 
<?xml version='1.0' encoding='gb2312' ?>
<root>
    <domain name='appbasesh.qzone.qq.com' operation='update'>
        <ip inner='10.149.24.156' outer='180.153.2.222' isp='ctc' type='inner_ip'/>
        <ip inner='10.150.16.29' outer='112.64.199.30' isp='cnc' type='com_proxy'/>
        <ip inner='10.149.24.157' outer='180.153.2.223' isp='ctc' type='inner_ip'/>
        <ip inner='10.149.24.158' outer='180.153.2.240' isp='ctc' type='inner_ip'/>
        <ip inner='10.149.24.159' outer='180.153.2.241' isp='ctc' type='inner_ip'/>
        <ip inner='10.149.24.160' outer='180.153.2.242' isp='ctc' type='inner_ip'/>
    </domain>
</root>

代码如下:

1
2
3
4
5
6
7
8
9
soup = BeautifulSoup(data,convertEntities=BeautifulStoneSoup.HTML_ENTITIES)
iplist = []
#获取所有包含属性type="inner_ip"的节点
allTags = soup.findAll(attrs={'type' : 'inner_ip'})
for tag in allTags:
    #获取属性列表
    for at in tag.attrs:
        #输出第一个属性的内容
        print at[0]

4.minidom
简介:生成XML的工具
中文支持:支持,但是需要如下注意:

  • 1.minidom的设置属性的方法是setAttribute,提供两个参数,一个属性名,一个属性值。之前在文章中介绍过,即当两个字符串相连时,encode/decode必须一致。
  • 2.当minidom输出时,如果想指定xml头的encode为utf-8,可以如下写:
  • 1
    
    print doc.toprettyxml(encoding='UTF-8')

    但是这里的要求就是,如果指定了encoding,那么传入minidom的字符串都应该decode成对应encoding的。而且这样toprettyxml输出的结果是encode过的。

备注:无
使用:

1
2
3
4
5
6
7
8
9
10
11
doc = minidom.Document()
item_info = doc.createElement("item_info")
item_info.setAttribute('maxid','90012')
doc.appendChild(item_info)
for o in mman_objs:
    item = doc.createElement("item")
    item_info.appendChild(item)
    for k in o.keys():
        attrdata = unicode(obj[k])
        item.setAttribute(unicode(k),attrdata)
objdatas = doc.toprettyxml(encoding='UTF-8',indent = "    ").decode('utf-8')

OK,这几个工具可以说涵盖了web开发中常用的几种交互方式,HTML/XML,json,模板替换,使用起来如鱼得水啊~


最近又发现了一个生成XML的更好的库,pyfo.
提供了python数据结构到XML的直接转化,并且对中文支持非常好。其测试代码tutorial.py中有详细使用说明。
需要注意的就是,测试代码没有说明属性的生成,其实每一行XML在pyfo中对应的是一个tuple(或list):

1
(name,data,attr)

其中name须为str,data基本可以为所有类型,attr必须为dict。
所以只要如下写:

1
('attr', 1,{'1':1,'2':2})

即可生成XML代码:

1
<attr 1="1" 2="2">1</attr>




原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/?p=1379

15 个评论 在 “关于使用python开发web应用的几个库总结”

  1. Dante 说:

    最近又发现了一个生成XML的更好的库,pyfo.
    http://pypi.python.org/pypi/pyfo/0.6
    提供了python数据结构到XML的直接转化,并且对中文支持非常好。其测试代码tutorial.py中有详细使用说明。
    需要注意的就是,测试代码没有说明属性的生成,其实每一行XML在pyfo中对应的是一个tuple(或list):
    (name,data,attr)
    其中name须为str,data基本可以为所有类型,attr必须为dict。
    所以只要如下写:
    (‘attr’, 1,{’1′:1,’2′:2})
    即可生成XML代码:
    <attr 1=”1″ 2=”2″>1</attr>

    [回复]

    依云 回复:

    貌似和那个json模块一样方便啊。有空再试,希望能顺利支持Python3,祈祷ing….

    [回复]

    Dante 回复:

    哈,用起来确实感觉不错,不过没试过是不是支持Python3……

    [回复]

  2. nsdy 说:

    。。 一直在使用C++
    说实话 一直想要学习gtk和python 总是感觉无从下手阿…

    [回复]

    wlb5396340 回复:

    http://www.tuxradar.com/python
    这个网站关于python和gtk的文章很好,还有视频演示

    [回复]

    nsdy 回复:

    谢了 兄弟

    [回复]

  3. Insion 说:

    如果要在一个模板中引包含另一个子模板的时候,这个子模板中有中文就会提示UnicodeDecodeError
    UnicodeDecodeError: ‘utf8′ codec can’t decode byte 0xca in position 572: invalid continuation byte,请问下这样要怎么处理才可以包含有中文的模板而不会出错呢?

    [回复]

    Dante 回复:

    模板是utf8的格式吗?用的是jinja2?

    [回复]

    lxneng 回复:

    我的文件是utf8的格式,但是也出现了UnicodeDecodeError错误
    设置了
    reload(sys)
    sys.setdefaultencoding(‘utf-8′)
    就出下面的错误
    UnicodeDecodeError: ‘utf8′ codec can’t decode byte 0×92 in position 53: unexpected code byte

    去掉就出现
    UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0×92 in position 53: ordinal not in range(128)

    [回复]

    Dante 回复:

    传入的中文参数必须是解码过的,比如 u’中国’,这样。

    [回复]

    lxneng 回复:

    解决了 是要给sqlalchemy的连接指定为charset =utf8

    谢谢

    [回复]

    lxneng 回复:

    我也遇到这样的问题, 请问你是怎么解决的?

    [回复]

  4. Insion 说:

    是jinja2,我现在用的flask会自动把jinja2也安装上去作为它的模板来用的。

    上面说那个问题我已经解决了,是因为文件实际的编码不是utf8,另存一下就没事了。

    但是用jinja2的话,在肯定模板是utf8编码的前提下通过用语句去包含我的子模板(其实就是我的网站的通用的头部),输出的时候头部会多出一两个换行(浏览器的HTML代码里貌似看不到BR换行符、应该是硬回车),导致css的排版会向下移动一两行的距离,后来我试下用web.py去写了一个模板去测试,发觉web.py的模板可以很好的显示出原来设计的页面。后来我就在flask下用mako去做模板,也没有问题,就是不明白,为什么套在jinja2里后会出现页面向下位移一两行的问题(可以render出页面),后来才发现只要一用include去包含其他模板就会这样,不知道你试过这样的问题没有?求解中~

    [回复]

    Dante 回复:

    嗯,好像确实有时候会多出来几行,不过因为对展示没有影响,所以一般都没管。。。。

    [回复]

  5. Insion 说:

    UI的设计差之毫厘谬之千里,原来jinja2这个问题不是我一个人遇到,jinja2没解决这个问题前都不会考虑用它了,现在使用的是mako。

    [回复]

我要评论

*

*