python 中文亂碼出現,不知道是什麼原因?
用python寫了一個代碼,用Windows-cmd運行,中文部分出現亂碼:
1、代碼如下2、結果如下:
請看類Linux下的代碼,你的問題是在windows下造成的。怎麼破?#coding:utf-8 修改為#coding:gbkhtml = page.read()修改為html = page.read().decode(utf-8).encode(gbk)小段代碼,建議完善幾個地方。
- 你要抓的網頁是utf8編碼的,所以你要先decode(utf8)轉成unicode
- print是用系統控制台輸出,必須要輸出它能兼容的格式,一般的中文windows都默認是gbk,但是因為你網頁內容有文字超過了gbk的編碼範圍,所以要用大一點的編碼gb18030
可以運行的測試代碼:
import urllib
s = urllib.urlopen(http://bj.58.com/hezu/25090223615153x.shtml).read()
print s.decode(utf8).encode(gb18030)
不需要改coding,更不需要換Linux。
問題原因有兩個:1 urllib獲取的結果是位元組串,而不是字元串。2 輸入文本到控制台時需要使用控制台可以兼容的字元編碼。所以解決辦法是:1 把urllib獲取的位元組串解碼,得到字元串。具體採用哪種編碼格式來解碼要看網頁。
2 把字元串編碼,編碼格式要用本地控制台兼容的編碼(比如gbk)。首先在簡中 windows中,cmd終端默認使用的編碼為 cp936,可通過以下方式查看.
Python2的print在cmd時輸出時,能正常顯示的數據有兩種:- unicode類型(輸出時自動轉換成gbk編碼)
- 以gbk編碼的str類型
如果遇到以utf-8編碼的str類型,就會出現亂碼
原來的URL失效了,我隨便拿了個地址測試,如
http://bj.58.com/hezu/?PGTID=0d100000-0000-1280-21bd-ea7721e52589ClickID=6也出現了問題中的亂碼。查看網頁源碼可以發現
網頁使用的是utf-8編碼,而 urllib的read返回的是str類型,也就是以utf-8編碼的str類型,因此出現了問題中的亂碼。前面幾個答案提到通過 .decode(utf-8).encode(gbk) 方式輸出,其實就是前面說的第2種數據(將網頁內容轉換為gbk編碼的str類型),這樣一來看似解決了亂碼,實際運行還是會遇到問題,例如輸出租房面積時,"m2" 中的上標2無法正確轉換html = u15m2
print html.decode(utf-8).encode(gbk)
Traceback (most recent call last): 建議解決方法:
File "test.py", line 40, in &
print html.decode(utf-8).encode(gbk)
File "C:Python27libencodingsutf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: ascii codec cant encode character uxb2 in position 3: ordinal not in range(128)
- 換用支持utf-8的終端
- 該方法實際同1:在cmd執行腳本前,執行 "chcp 65001" 將cmd臨時設為utf-8編碼,這樣可以直接print,不用再進行解碼編碼
先用瀏覽器查看該網頁是用什麼進行編碼的,然後在Python中用對應方式進行decode。
PS:
我只在Windows下寫Python遇到過中文亂碼,在Ubuntu下,從未遇到!!!!!!!應該是你抓取的網頁使用UTF-8編碼,只需要用decode將UTF-8轉成Unicode。
主要原因在於:windows 下的cmd.exe的默認中文編碼是gbk。所以你的程序在pycharm等編輯器運行正常,而在CMD中變成亂碼。可以嘗試更改UTF-8為GBK就可以正常在CMD中顯示。但是,這種情況下,PYCHARM中又是亂碼了。或者你可以更改CMD的默認漢字編碼。
推薦閱讀:
※Scrapy之斷點續爬
※Python 中 Requests 庫的用法
※好像發現了一個不錯的小工具
※反反爬蟲利器!教你怎麼用代理,撥號換IP……