代碼內容:python
url = 'https://movie.douban.com/j/search_subjects?type=movie'+ str(tag) + '&sort=recommend&page_limit=20&page_start=' + str(limit) response = urllib.request.urlopen(url, timeout=20) result = response.read().decode('utf-8','ignore').replace(u'\xa9', u'') result = json.loads(result)
錯誤內容爲:上述第二行代碼報錯UnicodeEncodeError: 'ascii' codec can't encode characters in position 28-29: ordinal not in range(128)json
1 認爲是代碼錯誤,或者是tab縮進錯誤編碼
2 百度搜索後得出以下分析:url
Python在安裝時,默認的編碼是ascii,當程序中出現非ascii編碼時,python的處理經常會報這樣的錯UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128),python沒辦法處理非ascii編碼的,此時須要本身設置將python的默認編碼,通常設置爲utf8的編碼格式。.net
可是在我使用的python3.6.5 默認就是utf8編碼格式,因此也不存在這種問題。我使用print(type(str))後輸出的也是str。code
3 發現python3 urlopen()連接地址中不能出現中文,而上述代碼的tag是傳入的中文字符,終於找到了問題的所在。blog
解決辦法:utf-8
使用urllib.parse.quote進行轉換。ci
url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=' + str(tag) + '&sort=recommend&page_limit=20&page_start=' + str(limit) url = quote(url, safe=string.printable) response = urllib.request.urlopen(url, timeout=20) result = response.read().decode('utf-8','ignore').replace(u'\xa9', u'') result = json.loads(result)
程序頭部須要添加string
from urllib.parse import quote
同時須要import string導入string模塊
方法quote的參數safe表示能夠忽略的字符。
string.printable表示ASCII碼第33~126號可打印字符,其中第48~57號爲0~9十個阿拉伯數字;65~90號爲26個大寫英文字母,97~122號爲26個小寫英文字母,其他的是一些標點符號、運算符號等。