Python requests庫中文亂碼問題

來源:互聯網
上載者:User

當使用requests庫的時候,會出現中文亂碼的情況

參考程式碼分析Python requests庫中文編碼問題

      Python HTTP庫requests中文頁面亂碼解決方案。

分析

根據這兩篇文章可知:

    分析requests的原始碼發現,text返回的是處理過的Unicode型的資料,而使用content返回的是bytes型的未經處理資料。也就是說,r.content相對於r.text來說節省了計算資源,content是把內容bytes返回. 而text是decode成Unicode. 如果headers沒有charset字元集的化,text()會調用chardet來計算字元集,這又是消耗cpu的事情.

1 2 3 4 import  requests   response  =  requests.get( 'http://www.dytt8.net/index.htm' ) print (response.text[ 200 : 300 ])

這裡測試使用電影天堂的網頁,因為網頁不太標準

輸出為

  

輸出了亂碼

response.encoding

從第二篇文章可以知道reqponse header只指定了type,但是沒有指定編碼(一般現在頁面編碼都直接在html頁面中),尋找原網頁可以看到

再找一個標準點的網頁查看,比如部落格園的網頁部落格園

response herders的Content-Type指定了編碼類別型

《HTTP權威指南》裡第16章國際化裡提到,如果HTTP響應中Content-Type欄位沒有指定charset,則預設頁面是'ISO-8859-1'編碼。這處理英文頁面當然沒有問題,但是中文頁面,就會有亂碼了。

解決

如果在確定使用text,並已經得知該站的字元集編碼時,可以使用 r.encoding = ‘xxx’ 模式, 當你指定編碼後,requests在text時會根據你設定的字元集編碼進行轉換. 

使用apparent_encoding可以獲得真實編碼

1 2 >>> response.apparent_encoding 'GB2312'

這是程式自己分析的,會比較慢

還可以從html的meta中抽取

1 2 >>> requests.utils.get_encodings_from_content(response.text) [ 'gb2312' ]

解決方案

1 2 # response.encoding = response.apparent_encoding response.encoding  =  'gb2312'

這時候的輸出為

  

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.