當前位置:首頁 » 編程語言 » python讀取中文亂碼

python讀取中文亂碼

發布時間: 2024-04-30 16:27:13

『壹』 python編程中中文輸出亂碼UnicodeEncodeError: 'ascii' codec can't encode character

樓主你好!肆余

其實按照你的代碼的邏輯來做是沒有錯的,無法顯示成utf-8編碼的文本其實是因為在request請求的時候,按照網頁的標識轉了碼,接著BeautifulSoup把已經是utf-8的文本又強轉了一次utf-8編碼,導致了無法正確的顯示,以想要拿到的塵銀時間為例,其實程序的目標字元串應該如下:

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

'''我們想要使用的字元串'''
target_str=':53'

'''兩次轉碼後的字元串'''
get_str=u':53'


歸根結底是兩個對象的類不同,但python不支持這兩種類型的強轉,個人想了個比較臨時的解決方案,算是個python打了個補丁,就是將字元串轉成二進制,再轉回字元串,這樣就unicode就不用給他加上編碼方式再轉成二進制字元串了,修改後的代碼如下:

#-*-coding:utf-8-*-
importrequests
frombs4importBeautifulSoup
fromdatetimeimportdatetime

defencode(s):
'''將字元串轉成二進制'''
return''.join([bin(ord(c)).replace('0b','')forcins])

defdecode(s):
'''將二進制轉換成字元串'''
return''.join([chr(i)foriin[int(b,2)forbins.split('')]])

res=requests.get('
)
res.encodeing='utf-8'

soup=BeautifulSoup(res.text,'html.parser')

'''每個中文字元都進行轉換處理'''
title=decode(encode(soup.select('#artibodyTitle')[0].text))
time=decode(encode(soup.select('.time-source')[0].contents[0].strip()))

chinese='%Y年%m月%d日%H:%M'
timesource=datetime.strptime(time,chinese)
print(title)
print(timesource)

看樓主在研究的過程中,對字元串的編碼原理的理解還有所欠派雹宴缺,這方面的資料在網上很多,可以再自行研究一下,能夠獲得長足的進步。

望採納,謝謝!

『貳』 Python+requests 爬取網站遇到中文亂碼怎麼辦

1. 遇到的中文亂碼問題
1.1 簡單的開始
使用requests來拔取網站內容十分方便,一個最簡單的代碼段只需要2-3行代碼就行。

點擊(此處)折疊或打開

  • url='http//www.pythonscraping.com/'

  • req= requests.get(url)

  • print(req.text)

  • tree= html.fromstring(req.text)

  • print(tree.xpath("//h1[@class='title']/text()"))

  • 上面的代碼段起作用的也就3行(2,4,5)代碼就獲取到我們想要的內容。當然還要導入一系列的包,比如說requests、lxml、html等。當然由於http//www.pythonscraping.com/是英文網站,不存在中文亂碼問題。

  • 1.2 麻煩的開始

  • 本來當時的想法是寫一些基礎模塊,方便之後開發的時候調用,減少重復性工作。為了保證代碼在任何情況下都不會出現bug,所以想著用同樣的代碼爬取中文網站獲取裡面的文字

  • 修改上面代碼中的兩行代碼:

  • 點擊(此處)折疊或打開

  • url='http://sports.sina.com.cn/g/premierleague/index.shtml'

  • print(tree.xpath("//span[@class='sec_blk_title']/text()"))

  • 運行程序可以發現,在語句print(req.text)輸出的內容中,中文字體已經是亂碼了。最後的結果輸出是['?????©è§x86é?x91', '??x80?x9cx9f?x9bx9eé??']

  • 2 亂碼解決辦法

  • 2.1 試錯

  • 由於之前爬取csdn上一個網頁沒有出現亂碼問題,但是在sina體育網站上出現了亂碼,所以當時以為不是編碼問題,以為是文檔壓縮問題。因為csdn獲取的頁面header里沒有「Content-Encodings」屬性,但是sina體育獲取的頁面header有「Content-Encodings」屬性--「Content-Encoding: gzip」。




  • 總結:參考上述文獻,結果還是沒有解決問題,但是就考慮是不是方向錯了。不過這部分工作也沒有白做,很多網站返回數據都會有壓縮問題,之後的工作中也能用上。


  • 2.2 亂碼終極解決辦法

  • 後來查閱官方文檔中response-content相關內容,說明了Requests會自動解碼來自伺服器的內容。Requests會基於HTTP頭部對響應的編碼作出有根據的推測,前提是響應文檔的HTTP headers裡面沒有相關字元集說明。官方文檔還說明了,如果你創建了自己的編碼,並使用codecs模塊進行注冊,你就可以輕松地使用這個解碼器名稱作為r.encoding的值, 然後由Requests來為你處理編碼。(自己沒有使用codecs模塊,所以這里不貼代碼了,不過按官方的說法使用codecs模塊是最簡單的一種方式。)

  • 另一份官方文檔片段明確說了reponse編碼處理方式:

  • Requests遵循RFC標准,編碼使用ISO-8859-1 。

  • 只有當HTTP頭部不存在明確指定的字元集,並且Content-Type頭部欄位包含text值之時, Requests才不去猜測編碼方式。


  • 現在直接上實驗結果,在原始代碼中添加以下代碼片段:

  • 點擊(此處)折疊或打開

  • print(req.headers['content-type'])

  • print(req.encoding)

  • print(req.apparent_encoding)

  • print(requests.utils.get_encodings_from_content(page_content.text))

  • 輸出結果分別是:

  • text/html

  • ISO-8859-1#response內容的編碼

  • utf-8#response headers里設置的編碼

  • ['utf-8']#response返回的html header標簽里設置的編碼

  • 返回的內容是採用『ISO-8859-1』,所以出現了亂碼,而實際上我們應該採用『utf-8』編碼


  • 總結:當response編碼是『ISO-8859-1』,我們應該首先查找response header設置的編碼;如果此編碼不存在,查看返回的Html的header設置的編碼,代碼如下:

  • 點擊(此處)折疊或打開

  • if req.encoding=='ISO-8859-1':

  • encodings= requests.utils.get_encodings_from_content(req.text)

  • if encodings:

  • encoding= encodings[0]

  • else:

  • encoding= req.apparent_encoding

  • encode_content= req.content.decode(encoding,'replace').encode('utf-8','replace')

『叄』 python讀取中文目錄出現亂碼

先對路徑進行unicode處理,然後再打開。舉例:

inpath = 'E:\MyProject\SVN_Project\Drawingboard_local\model\mydata\input\proction\示波器\0.htm'
uipath = unicode(inpath, "utf8")
然後用"uipath"經過編碼後的路徑去open()即可:
fin = open(uipath)

『肆』 python中文顯示亂碼,已經在開頭有了coding: utf-8

亂碼原因:
因為你的文件聲明為 utf-8,並且也應該是用 utf-8 的編碼保存的源文件。但是 windows 的本地默認編碼是 cp936,也就是 gbk 編碼,所以在控制台直接列印 utf-8 的字元串當然是亂碼了。

解決方法:

py文件用記事本打開,另存為utf-8格式即可

『伍』 python 中文亂碼問題

記事本是用utf-8保存你下載了東西的。你下載下來的不是utf-8,保存下來中文當然就亂碼了。而gbk和utf-8里英文的編碼值都一樣,所以不受影響。

一個方法是你留意下目標頁面的charset 和 contentType,另一個方法是你復制一個目標頁面的字,放cmd里看它的編碼長度,以此來判斷它的原來編碼。

『陸』 python 用os.walk()遍歷目錄時,中文文件名顯示為亂碼

#coding=gb18030

import os,sys

def processunicode(value): #定義一個處理unicode類型字元串的函數
v1=''
for a in value:
if type(a)=='unicode':
v1=v1+str(a.encoe('gb18030'))
else:
v1=v1+str(a)
return v1

print processunicode(export) #把要列印的參數傳給該函數,並列印出來

『柒』 python命令行輸入中文亂碼怎麼辦

python2.X,代碼中指定了UTF-8,但是在cmd命令行窗口時,列印的中文仍然會亂碼。

在python3不存在該問題

運行結果:

原因

中文windows默認的輸出編碼為gbk ,與腳本中定義的UTF-8不一樣,所以出現了解碼失敗的情況。

相關推薦:《Python基礎教程》

解決方法

有如下兩種方法可以解決這個問題

方法一

我們可以通過先把中文解碼為unicode,然後再轉化為gbk來解決這個問題:

修改後運行結果:

方法二

當然,我們也可以通過改變cmd命令行窗口的輸出格式來解決這個問題:

·chcp 65001 就是換成UTF-8代碼頁

·chcp 936 可以換回默認的GBK

但是這樣就降低了腳本的兼容性,在其他環境運行的時候可能還會出現這樣的錯誤,而且可能會影響其他腳本運行,所以推薦使用第一種方法。

『捌』 python print中文亂碼問題 win10 Python2

python2字元串編碼的問題,如果要輸出中文可以使用u前綴,這樣就可以直接使用了

a=u'你好'
printa

這樣就可以了

熱點內容
我的世界多人游戲伺服器有哪些 發布:2024-05-21 09:02:48 瀏覽:589
社保計算編程 發布:2024-05-21 08:52:49 瀏覽:529
船用空氣壓縮機 發布:2024-05-21 08:49:11 瀏覽:185
oppo怎麼查密碼是多少 發布:2024-05-21 08:48:28 瀏覽:139
我的世界伺服器怎麼禁用傳送 發布:2024-05-21 08:35:51 瀏覽:106
python程序設計基礎 發布:2024-05-21 08:34:06 瀏覽:302
csql類 發布:2024-05-21 08:19:38 瀏覽:413
高通晶元代碼編譯 發布:2024-05-21 08:06:46 瀏覽:480
預編譯cpp 發布:2024-05-21 08:01:12 瀏覽:91
我的世界伺服器如何挖 發布:2024-05-21 07:39:12 瀏覽:794