(轉)python3 urllib.request.urlopen() 錯誤UnicodeEncodeError: 'ascii' codec can't encode characters


代碼內容:

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)

1 認為是代碼錯誤,或者是tab縮進錯誤

2 百度搜索后得出如下分析:

Python在安裝時,默認的編碼是ascii,當程序中出現非ascii編碼時,python的處理常常會報這樣的錯UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128),python沒辦法處理非ascii編碼的,此時需要自己設置將python的默認編碼,一般設置為utf8的編碼格式。

但是在我使用的python3.6.5 默認就是utf8編碼格式,所以也不存在這種問題。我使用print(type(str))后輸出的也是str。

3 發現python3 urlopen()鏈接地址中不能出現中文,而上述代碼的tag是傳入的中文字符,終於找到了問題的所在。

解決辦法:

使用urllib.parse.quote進行轉換。

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)

  


程序頭部需要添加

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個小寫英文字母,其余的是一些標點符號、運算符號等。

如果去掉safe參數的內容將會出錯。
---------------------
作者:xjtu帽帽
來源:CSDN
原文:https://blog.csdn.net/qq_25406563/article/details/81253347
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM