在爬取網頁時,出現中文亂碼情況,如下圖:
原因:源網頁編碼和爬取下來後的編碼格式不一致字串在python內部的表示是unicode編碼,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼
decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode(「gb2312」),表示將gb2312編碼的字串str1轉換成unicode編碼
encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode(「utf-8」),表示將unicode編碼的字串str2轉換成utf-8編碼
decode中寫的是想爬取的源網頁的編碼,或者文字檔案的編碼,encode是自己想設定的編碼在bytes和str的互相轉換過程中,實際就是編碼解碼的過程,必須顯式地指定編碼格式
str轉bytes
bytes是一種位元流(位元組流),它的存在形式是h =
"字串str"
# h為字串
(type
(h))
## 字串轉換為bytes型別,方式一
bytes1 = h.encode(
"utf-8"
(type
(bytes1))#
(bytes1)
#b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2str'
# 字串轉換為bytes型別,方式二
bytes2 =
bytes
(h, encoding=
"utf-8"
(type
(bytes2))#
(bytes2)
#b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2str'
10010101101
這種。我們無論是在寫**,還是閱讀文章的過程中,肯定不會有人直接閱讀這種位元流,它必須有乙個編碼方式,使得它變成有意義的位元流,而不是一堆晦澀難懂的01組合。從上面例子可以看出,h是個字串型別。python有個內建函式bytes()可以將字串str型別轉換成bytes型別,bytes1實際上是一串01的組合,但為了在ide環境中讓我們相對直觀的觀察,它被表現成了b』\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2str』這種形式,開頭的b表示這是乙個bytes型別。\xe5是十六進製制的表示方式,它占用1個位元組的長度,因此==「字串str」被編碼成utf-8後,我們可以數得出一共用了12個位元組,每個漢字占用3個,英文本母用1個==。在使用內建函式bytes()的時候,必須明確encoding的引數,不可省略。
字串類str裡有乙個encode()方法,它是從字串向位元組流的編碼過程。而bytes型別恰好有個decode()方法,它是從位元組流向字串解碼的過程
bytes轉str
h = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2str'
# h為bytes
(type
(h))
## bytes裝換為字串,方式一
string2 = h.decode(
"utf-8"
)#預設引數為utf-8
(type
(string2))#
(string2)
#字串str
# bytes轉換為字串,方式二
string1 =
str(h,
"utf-8"
(type
(string1))#
(string1)
#字串str
python 網頁爬蟲亂碼以及轉碼問題
前言 python 3最重要的新特性大概要算是對文字和二進位制資料作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示。python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字串和位元組包,也無法在位元組包裡搜...
python 亂碼轉碼 Python解決亂碼問題
解決python亂碼問題 字串在python的內部採用unicode的編碼方式,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼 decode 成unicode,再從unicode編碼 encode 成另一種編碼。編碼是一種用二進位制資料表示抽象字元的方式,utf...
Python爬蟲爬取網頁轉碼報錯
在使用python編寫爬蟲爬取 頁面資料時,遇到編碼錯誤,具體問題如下。爬蟲 request urllib2.request url,headers headers response urllib2.urlopen request return response.read decode gbk 執行...