python urllib2中文亂碼怎麼解決
很多亂碼問題是編碼造成的,一般對於中文網站基本是UTF-8,GB2312,可以GB18030通吃。
另一個造成亂碼的原因是壓縮格式,很多規模較大的網站都是以gzip的壓縮格式輸出頁面的,所以在用BS解析之前需要先判斷該網頁是否經過壓縮,如果經過壓縮則先進行解壓操作。
相關推薦:《》
程式碼:
# coding: u8 import urllib2 url = "" response = urllib2.urlopen(url) html = response.read() print html
輸出:
wױ83’͠L/J .uVխ[w5;:S煝{7l!Zp8′-y϶=ePUsł;__Zj ::]K챵 eYڕkV%IBUVY”*’)ڤS. JT>”TTZk+!x*)ld2I,kUUҭ/kXjjkHI U0n2}jUSݲ”>!pj^[LJg’o^=Nqȕ7n|57yy’ul j=9T,g/t0ݕ7’^o|v}>8=7흯!tpٹˏgFS?zd~`MuC%U2 f߉Vqߍ7~2~ɓlE=}M}Xwo}us’>?*zpS:7Oݚ~чb= HK!sعinQR}@TsY|,#bd+#yM@qaRTPVNw ?[((tGP,A$O/EXP)oNgA`Z 4 eL7ȓVn+ ɄeR fT`&WՂbV f{ j_p@-@[Ib_ͷCZ’!4O1C,کhy b0W(ժZ˨V5-ټX)5{EkvXÝN (PPUCkϫ? j( V3{Z!LOOP+LP%WPL!=! @XD8ׯjpT,W+#we~م {CBo@_Y+ijp;^,=(h :NxH|Ar]-|Bkq< ڻ+}.ܹlt.)cptRXJ4CJЃBv@BXdP&6dógsR^=/fb@s#m} uZh.V80_)$.1W hS*zQJÑ|ă{nIPa±a#نL<SA %^yg2*fxJhQh_FBK(c%cBKwaHeRB 8w6<ϾK @.k*[k|^_¹BV;,pu]24Y BwԢCm3`>5#FzFG-%Ũ W0A{TȪ#u4@e24߈*:*6Ђt&XGe@dc%cເh|y$HhGv3s$(Y)sYMvE@lC(.tkب6K(E;Op1?: D6wОƘfO&zqZ3Z>0MC{ڟi#. tPڻu-u-t38X Wt2h!.>9;TVKrj_$yABZȊ6.ƭIyK:¬ s#lhsxzb=INse/FUad4H3lnHo0T^”j*]yfrMY!-#I(YVaΡ@1kE뗴2=qRtۈh@y@(GX)I-Z$lNX,vg^~cE /虯&jz=АUdY__FGA} …
首先想到編碼問題
isinstance(html, str) == True
並且頁面的編碼確定為 GBK,那麼
html.decode('gbk').encode('utf-8')
就可以將機器碼以 gbk 解碼,再重新以 utf-8 編碼,就可以得到正確的文字。可是收到這樣的提示:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 1-2: illegal multibyte sequence
可能是以 gzip 壓縮格式輸出造成的亂碼,於是嘗試透過 zlib 解壓縮。
import zlib html = zlib.decompress(html)
可是卻得到下面的錯誤:
zlib.error: Error -3 while decompressing data: incorrect header check
無奈,只得用 gzip 庫和 StringIO 庫繞路解決。
import gzip, StringIO html = gzip.GzipFile(fileobj=StringIO.StringIO(html), mode="r") html = html.read().decode('gbk').encode('utf-8’)
終於得到了正確的內容和正確的編碼。
問題到這裡就解決了,可是對於不能直接使用簡潔的 zlib 庫表示很不甘心,畢竟根據 python 的文件 gzip 庫也是呼叫 zlib 來解壓的,為什麼不直接用 zlib 呢?最終程式碼如下:
request = urllib2.Request(url) request.add_header('Accept-encoding', 'gzip') opener = urllib2.build_opener() response = opener.open(request)html = response.read() gzipped = response.headers.get('Content-Encoding') if gzipped: html = zlib.decompress(html, 16+zlib.MAX_WBITS) print html
程式碼裡在 request header 中預設加入了接受 gzip,伺服器會優先返回 gzip 後的頁面,這樣極大減少資料流的大小,絕大多數伺服器都是支援 gzip 的。之後對於意外情況,也加入了對 response header 的判斷,對於不包含“Content-Encoding”的資料流就不會去對其解壓縮。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/818/viewspace-2836276/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cat中文正常vim中文亂碼怎麼解決?
- python檔案中寫中文亂碼怎麼解決Python
- vscode中文亂碼怎麼解決 vscode輸出亂碼怎麼解決VSCode
- python讀取文字內容中文亂碼怎麼解決Python
- URL地址中的中文亂碼怎麼解決?
- filezilla裡怎麼解決中文亂碼問題
- python建立檔名亂碼怎麼解決Python
- python 中文亂碼問題解決方案Python
- RHEL中文亂碼解決
- HttpClient 解決中文亂碼HTTPclient
- centos vim亂碼怎麼解決?CentOS
- request/response解決中文亂碼
- eclipse中文亂碼解決Eclipse
- myeclipse解決中文亂碼Eclipse
- 解決Linux中文亂碼Linux
- ROS中解決中文亂碼ROS
- 解決中文亂碼問題
- pycharm控制檯亂碼怎麼解決?PyCharm
- android php 亂碼怎麼解決AndroidPHP
- python爬取中文輸出亂碼怎麼辦Python
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- 解決 SecureCRT 和 SecureFX 中文亂碼Securecrt
- Java 解決中文亂碼問題Java
- RDSSQLSERVER解決中文亂碼問題SQLServer
- Windows下Clion中文亂碼解決Windows
- 徹底解決Oracle中文亂碼Oracle
- 解決MySQL中文亂碼問題MySql
- Node.js 中文亂碼解決Node.js
- 解決SecureCRT中文顯示亂碼Securecrt
- QT中文顯示亂碼解決QT
- Xshell中文亂碼怎麼處理?
- Spring MVC 中文編碼亂碼解決SpringMVC
- C# 解決httplistener querystring 中文亂碼、返回json中文格式亂碼C#HTTPJSON
- mysql命令列查詢亂碼怎麼解決?MySql命令列
- 碰見檔名變亂碼怎麼解決?
- win10 libreoffice開啟csv檔案中文亂碼怎麼解決Win10
- Dbvisualizer9.0.6 解決中文亂碼