Python 列表内字符编码问题,encode和decode

来源:互联网 发布:淘宝网怎么是电脑版 编辑:程序博客网 时间:2024/05/06 02:50

在学习python爬虫时遇到个小问题,记录一下:

列表内的元素用循环单个输出的话,是正常的中文显示,而用 append 方法添加到集合再直接输出集合的时候,显示的是下面的Unicode编码格式。

import urllib2import randomfrom bs4 import BeautifulSouphds=[{'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'},\    {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'},\    {'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'},\    {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'},\    {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'},\    {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'},\    {'User-Agent':'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11'},\    {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'}]url='https://www.douban.com/tag'tags=[]req=urllib2.Request(url,headers=hds[random.randint(0,len(hds)-1)])source_code=urllib2.urlopen(req).read()plain_text=str(source_code)soup=BeautifulSoup(plain_text)tag_lists=soup.find('ul',{'class':'topic-list'}).findAll('a')for tag_list in tag_lists:    print tag_list.get_text()    tags.append(tag_list.get_text())print tags
香港台湾北京上海日本韩国英国意大利清迈巴黎欧洲火车[u'\u9999\u6e2f', u'\u53f0\u6e7e', u'\u5317\u4eac', u'\u4e0a\u6d77', u'\u65e5\u672c', u'\u97e9\u56fd', u'\u82f1\u56fd', u'\u610f\u5927\u5229', u'\u6e05\u8fc8', u'\u5df4\u9ece', u'\u6b27\u6d32', u'\u706b\u8f66']

后来发现字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。


因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

代码中字符串的默认编码与代码文件本身的编码一致。

如:s='中文'
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。

如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。如果一个字符串已经是unicode了,再进行解码则将出错。

以上问题应该是python2的问题,在python3中默认编码格式有调整,解决编码问题

阅读全文
0 0
原创粉丝点击