Python輸出豆瓣個人主頁源代碼出現編碼錯誤?

小弟最近在學Python,試著獲取網頁源碼並輸出。

目標網頁:宋樂天

用瀏覽器查看網頁源碼,編碼是utf-8:

&

代碼如下,Python 版本是3.5:

import urllib.request

url = r"http://www.douban.com/people/songlet/" # 宋樂天的主頁
response = urllib.request.urlopen(url)
html = response.read().decode("utf-8")
print(html)

命令行運行後,錯誤提示如下:

Traceback (most recent call last):
File "F:PythonWorkspaceDouban-Album-Download .py", line 6, in &
print(html)
UnicodeEncodeError: "gbk" codec can"t encode character "u30fb" in position 50763: illegal multibyte sequence

把print(html)注釋掉就不會報錯,不知道是哪裡不對


py3里的str類型都是utf8,你用的是windows,終端是gbk的,print的時候會將utf8解碼輸出。但是utf8覆蓋全unicode集,而gbk只能覆蓋部分unicode字符集,而頁面里有不能編碼為gbk(也就是gbk中不包含)的utf8字元,因此encode失敗。

u30fb如果沒記錯,應該是個全形的中間位置的小圓點。


import sys

reload(sys)

sys.setdefaultencoding("utf-8")


自問自答一下,總算找到解決辦法了。

原理如 @Coldwings 所述。

解決方法是在輸出的時候轉碼為gbk,捨棄不存在的字元。 Python 3 可用:

print(message.encode("gbk", errors = "ignore").decode("gbk"))

當然也可以選擇直接存入文件,然後打開文件查看


這個問題我遇到過。。在終端下切換字符集可以 chcp 65001


應該是你的print輸出的字元出錯了。 換成其他的格式就行了。

一般搞爬蟲的都會遇到這個問題。


你好,非常感謝你自己的回復。我也碰到一樣的問題,是twitter的網頁,但是print是編碼錯誤,按照你說的print(x.encode("gbk",error="ignore")).decode("gbk"))確實能列印了,但是很無奈的是明明有17萬行,它只列印了最後1800多行。按理解豈不是前面17萬多都有不能編碼成gbk的utf-8碼,然後既然這樣,我想問一下,如果我只是read的話,不print他,那能read到所有17萬行源代碼嗎?如果看到,請您指教,確實著急,謝謝


推薦閱讀:

如何應對網站反爬蟲策略?如何高效地爬大量數據?
如何爬取伺服器日誌log和資料庫?
當爬蟲不遵守 robots 協議時,有沒有防止抓取的可能?
網路搜索引擎為什麼又要叫爬蟲?

TAG:Python | 爬蟲計算機網路 | 豆瓣 |