1. 程式人生 > >Python 列表內字元編碼問題,encode和decode

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中預設編碼格式有調整,解決編碼問題