python2.7爬蟲中decode("utf-8")出錯該如何解決?

代碼如下:

# -*- coding: utf-8 -*-

import urllib2,urllib

myUrl = "http://qiushibaike.com/hot/page/1"

user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"

headers = { "User-Agent" : user_agent }

req = urllib2.Request(myUrl, headers = headers)

myResponse = urllib2.urlopen(req)

myPage = myResponse.read()

#decode的作用是將其他編碼的字元串轉換成unicode編碼

unicodePage = myPage.decode("utf-8")

運行的時候出錯:

UnicodeDecodeError: "utf8" codec can"t decode byte 0xb6 in position 61307: invalid start byte

請問出錯的原因是什麼?該怎麼解決?


神tm注釋……

decode不是編碼轉換,decode是把一個無編碼的str,依照給入的參數為解碼系統,解碼後映射到unicode字符集,返回為unicode對象……

出錯的原因正是因為國內網站熱衷於瞎搞,於是一個頁面里混了多種編碼。如果不是關鍵內容,解不出來就ignore也是可以的。瀏覽器的解碼部分通常有個fallback,對utf8解不出來的字元嘗試使用本地locale,同樣的東西你也可以試試,自己擴展個decoder就好。

——————————

順帶,那些說py3的,如果多種編碼混一起,py3比2麻煩好幾倍。


返回的文本當中有utf-8中的非法字元,這不是你的問題,是對方網頁的問題。爬蟲抓取經常會遇到類似這樣的情況,你永遠不能假設對方網頁設計的沒問題。


還是先了解一下 python 中編碼,解碼,byte類型,str類型以及如何互轉再寫代碼吧,不然遇到一個簡單的坑也可能深陷幾天無法自拔。


myPage 已經是utf-8

就不需要再decode()

看python培訓黃哥的三篇文章

python開發爬蟲漢字編碼不再是問題:

將python2中漢字會出現亂碼的事一次性說清楚

article/python_bianma.md at master · pythonpeixun/article · GitHub

python爬蟲訪問多個網站、中文編碼的處理。

python爬蟲訪問多個網站、中文編碼的處理。

python3訪問sina首頁中文的處理

python3訪問sina首頁中文的處理


用3.x或許你能減少很多苦惱!這是頁面的問題,你要達到100%瀏覽器的水準是不可能滴。

中國的大牛們還開發不出與chrome匹敵滴瀏覽器滴。


最後一句改成

unicodePage = myPage.decode("utf-8", "ignore")試試


你為什麼假定網頁的編碼一定是utf8呢,試試gbk,gb2132,gb18030。之前做爬蟲就是這幾種編碼都試一遍~~


推薦閱讀:

說郵箱的時候為什麼經常用「#」代替「@」?
如何抓取url不變的網站數據?
beautifulsoup與scrapy 這兩者之間有什麼區別?
selenium 怎樣設置請求頭?
網頁上的一張圖片右鍵選擇新窗口打開是正常的,直接複製地址到地址欄打開就不正常了。誰知道是什麼原因嗎?

TAG:Python | 網頁爬蟲 |