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

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

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

import urllib2
import random
from bs4 import BeautifulSoup
hds=[{'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中默认编码格式有调整,解决编码问题

你可能感兴趣的:(Python)