問題描述
在寫爬蟲爬取網頁信息時,發生了以下錯誤:
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0'
意思大致是Unicode編碼錯誤,gbk編解碼器不能編碼\xa0字符。
爬蟲程序爬取的是課程信息,包含中文。使用requests庫訪問網頁,使用BeautifulSoup庫解析網頁,用get_text()方法獲取標簽內的文本信息。
python版本為3.5,在cmd控制台中運行python腳本。
代碼大致如下:
import requests
from bs4 import BeautifulSoup
r = requests.get(url,cookies=cookies,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
lesson_data_list = soup.find_all(id="xjs_table")[0].find_all("tr")[1:]
for lesson_data in lesson_data_list:
td = lesson_data.find_all("td")
name = td[0].get_text()
credit = td[1].get_text()
teacher = td[2].get_text()
time = td[5].get_text()
total = td[11].get_text()
print(name,credit,teacher,time,total)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
本問題與Python異常UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\ufffd’類似。
錯誤原因
當我們獲取這個網頁的源代碼的時候,是將這個網頁用utf-8的解碼方式將其轉換成對應的Unicode字符,當我們使用print()函數將其打印到Windows系統的DOS窗口上的時候(DOS窗口的編碼方式是GBK),自動將Unicode字符通過GBK編碼轉換為GBK編碼方式的str。
整個過程是: [用python爬取] UTF-8(str) -> [緩存中存放] Unicode(byte) -> [DOS中顯示] GBK(str)
對比原網頁,發現報錯的位置原本要輸出的文本為空,也就是目標標簽內的值為 。
網頁源代碼中的 的utf-8 編碼是:\xc2 \xa0,轉換為Unicode字符為:\xa0,當顯示到DOS窗口上的時候,轉換為GBK編碼的字符串,但是\xa0這個Unicode字符沒有對應的 GBK 編碼的字符串,所以出現錯誤。
來自:Code Table
解決辦法
用空格 來替換 \xa0 ( ):
方法1:在網頁源碼上替換 
在解析之前對r.text中的網頁源碼的 進行替換
import requests
from bs4 import BeautifulSoup
r = requests.get(url,cookies=cookies,headers=headers)
#用空格 來替換
soup = BeautifulSoup(r.text.replace(' ', ' '),"lxml")
1
2
3
4
5
6
方法2:在解析為Unicode之后替代\xa0
在get_text()解析之后對u'\xa0'進行替換
import requests
from bs4 import BeautifulSoup
r = requests.get(url,cookies=cookies,headers=headers)
soup = BeautifulSoup(r.text,"lxml")
lesson_data_list = soup.find_all(id="xjs_table")[0].find_all("tr")[1:]
for lesson_data in lesson_data_list:
td = lesson_data.find_all("td")
name = td[0].get_text().replace(u'\xa0', u' ')
credit = td[1].get_text().replace(u'\xa0', u' ')
teacher = td[2].get_text().replace(u'\xa0', u' ')
time = td[5].get_text().replace(u'\xa0', u' ')
total = td[11].get_text().replace(u'\xa0', u' ')
print(name,credit,teacher,time,total)
---------------------
作者:曾記否?
來源:CSDN
原文:https://blog.csdn.net/qq_38607035/article/details/82595170
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
