python3爬蟲編碼問題

2022-05-21 22:42:10 字數 2947 閱讀 2484

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

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

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標籤

如:

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...