python3爬蟲編碼問題

2021-08-18 00:06:45 字數 4473 閱讀 4314

使用爬蟲爬取網頁經常遇到各種編碼問題,因此產生亂碼

今天折騰了一天,全部總結一遍

import requests

url=""

response = requests.get(url)

content = response.text

print(content)

結果有**顯示,但是出現亂碼

使用urllib庫

import urllib.request

response = urllib.request.urlopen('')

print(response.read())

結果有**顯示,但是以二進位制返回

接下來介紹encode()和decode()方法

encode()用於解碼,decode()方法用於編碼

注:python3預設編碼為utf-8

例1:

text = '中華'

print(type(text))

print(text.encode('gbk'))#以gbk形式解碼,即把utf-8的字串text轉換成gbk編碼

print(text.encode('utf-8'))#以utf-8形式解碼,因為原本是utf-8編碼,所以返回二進位制

print(text.encode('iso-8859-1'))#報錯

返回結果:

b'\xd6\xd0\xbb\xaa'

b'\xe4\xb8\xad\xe5\x8d\x8e'

unicodeencodeerror: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)

為什麼第四個報錯?

我查尋了一下latin-1是什麼?

latin1是iso-8859-1的別名,有些環境下寫作latin-1。

iso-8859-1編碼是單位元組編碼。

unicode其實是latin1的擴充套件。只有乙個低位元組的uncode字元其實就是latin1字元(這裡認為unicode是兩個位元組,事實上因為各種版本不一樣,位元組數也不一樣)

所以我的理解是:因為中文至少兩個位元組,所以不能解碼出來

例2:

text = '中華'

print(type(text)) #text1 = text.encode('gbk')

print(type(text1)) #print(text1) #b'\xd6\xd0\xbb\xaa'

text2 = text1.decode('gbk')

print(type(text2)) #print(text2) #中華

text3 = text1.decode('utf-8') #報錯:unicodedecodeerror: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte

print(text3)

text4= text.encode('utf-8')

print(type(text4)) #print(text4) #b'\xe4\xb8\xad\xe5\x8d\x8e'

text5 = text4.decode('utf-8')

print(type(text5)) #print(text5) #中華

text6 = text4.decode('gbk') #報錯:unicodedecodeerror: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence

print(text6)

import requests

url=""

response = requests.get(url)

content = response.text.encode('iso-8859-1').decode('utf-8')

#把網頁源**解碼成unicode編碼,然後用utf-8編碼

print(content)

使用urllib庫

import urllib.request

response = urllib.request.urlopen('')

print(response.read().decode(utf-8))

2.關於網頁源**是gbk或者gb2312編碼的網頁:

import requests

response = requests.get('')

#print(response.text)

html = response.text

print(html)

結果返回亂碼

import urllib.request

#get請求

response = urllib.request.urlopen('')

print(response.read())

結果返回二進位制

正確**:

import requests

response = requests.get('')

#print(response.text)

html = response.text.encode('iso-8859-1').decode('gbk')

print(html)

import urllib.request

#get請求

response = urllib.request.urlopen('')

print(response.read().decode('gbk'))

附:如何看網頁源**的編碼格式?

使用f12檢視網頁源**的head標籤裡的meta標籤

如:

2019.6.18新增:

ascii字符集 :

ascii(american standard code for information interchange,美國資訊交換標準**)是基於拉丁字母的一套電腦編碼系統,用於顯示現代英語,主要包括控制字元(回車鍵、退格、換行鍵等)和可顯示字元(英文大小寫字元、阿拉伯數字和西文符號)。

基本的ascii字符集,使用7位(bits)表示乙個字元,共128字元。ascii的擴充套件字符集使用8位(bits)表示乙個字元,共256字元,方便支援歐洲常用字元。

iso-8859-1字符集:

拉丁碼表,別名latin-1,用於顯示歐洲使用的語言,包括荷蘭、丹麥、德語、義大利語、西班牙語等。

iso-8859-1使用單位元組編碼,相容ascii編碼。

gb***字符集:

gb就是國標的意思,是為了顯示中文而設計的一套字符集。

gb2312:簡體中文碼表。乙個小於127的字元的意義與原來相同。但兩個大於127的字元連在一起時,就表示乙個漢字,這樣大約可以組合了包含7000多個簡體漢字,此外數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在ascii裡本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,這就是常說的"全形"字元,而原來在127號以下的那些就叫"半形"字元了。

gbk:最常用的中文碼表。是在gb2312標準基礎上的擴充套件規範,使用了雙位元組編碼方案,共收錄了21003個漢字,完全相容gb2312標準,同時支援繁體漢字以及日韓漢字等。

gb18030:最新的中文碼表。收錄漢字70244個,採用多位元組編碼,每個字可以由1個、2個或4個位元組組成。支援中國國內少數民族的文字,同時支援繁體漢字以及日韓漢字等。

unicode字符集 :

unicode編碼系統為表達任意語言的任意字元而設計,是業界的一種標準,也稱為統一碼、標準萬國碼。

它最多使用4個位元組的數字來表達每個字母、符號,或者文字。有三種編碼方案,utf-8、utf-16和utf-32。最為常用的utf-8編碼。

utf-8編碼,可以用來表示unicode標準中任何字元,它是電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。網際網路工程工作小組(ietf)要求所有網際網路協議都必須支援utf-8編碼。所以,我們開發web應用,也要使用utf-8編碼。它使用一至四個位元組為每個字元編碼,編碼規則:

1. 128個us-ascii字元,只需乙個位元組編碼。

2. 拉丁文等字元,需要二個位元組編碼。 

3. 大部分常用字(含中文),使用三個位元組編碼。

4. 其他極少使用的unicode輔助字元,使用四位元組編碼。

python3爬蟲編碼問題

使用爬蟲爬取網頁經常遇到各種編碼問題,因此產生亂碼 今天折騰了一天,全部總結一遍 import requests url response requests.get url content response.text print content 結果有 顯示,但是出現亂碼 使用urllib庫 imp...

Python3編碼問題

python3最重要的進步之一就是解決了python2中字串與字元編碼的問題。python2字串的缺陷如下 而python3則把系統預設編碼設定為了 utf 8 import sys sys.getdefaultencoding utf 8 之後,文字字元和二進位制資料分別用str和bytes表示。...

python3編碼問題

編碼問題 在python3中只有兩種資料型別 1 str 編碼形式是unicode,unicode任一字元編碼都存在 2 bytes 編碼形式是十六進製制 編碼encoding utf,gbk都只是一種編碼規則,按照各自的規則進行編碼,可以存在多種編碼規則 s hello中國 在記憶體中是以unic...