最后更新于 .

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

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

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

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,如下:

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

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

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中):

<?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>

代码如下:

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的工具 中文支持:支持,但是需要如下注意:

print doc.toprettyxml(encoding='UTF-8')
  • 1.minidom的设置属性的方法是setAttribute,提供两个参数,一个属性名,一个属性值。之前在文章中介绍过,即当两个字符串相连时,encode/decode必须一致。
  • 2.当minidom输出时,如果想指定xml头的encode为utf-8,可以如下写:
  • 但是这里的要求就是,如果指定了encoding,那么传入minidom的字符串都应该decode成对应encoding的。而且这样toprettyxml输出的结果是encode过的。

备注:无 使用:

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):

(name,data,attr)

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

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

即可生成XML代码:

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

 

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. Dante

    Dante on #

    最近又发现了一个生成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代码:
    &lt;attr 1="1" 2="2"&gt;1&lt;/attr&gt;

    Reply

    1. 依云

      依云 on #

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

      Reply

      1. Dante

        Dante on #

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

        Reply

  2. nsdy

    nsdy on #

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

    Reply

    1. wlb5396340

      wlb5396340 on #

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

      Reply

      1. nsdy

        nsdy on #

        谢了 兄弟

        Reply

  3. Insion

    Insion on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. lxneng

        lxneng on #

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

        去掉就出现
        UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 53: ordinal not in range(128)

        Reply

        1. Dante

          Dante on #

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

          Reply

          1. lxneng

            lxneng on #

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

            谢谢

            Reply

    2. lxneng

      lxneng on #

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

      Reply

  4. Insion

    Insion on #

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

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

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  5. Insion

    Insion on #

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

    Reply

发表评论