python 中文亂碼出現,不知道是什麼原因?

用python寫了一個代碼,用Windows-cmd運行,中文部分出現亂碼:

1、代碼如下

2、結果如下:


請看類Linux下的代碼,你的問題是在windows下造成的。

怎麼破?

#coding:utf-8 修改為#coding:gbk

html = 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時輸出時,能正常顯示的數據有兩種:

  1. unicode類型(輸出時自動轉換成gbk編碼)

  2. 以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)

建議解決方法:

  1. 換用支持utf-8的終端

  2. 該方法實際同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……

TAG:Python | 編程 | Python入門 | 中文亂碼 |