Python異常UnicodeEncodeError 'gbk' codec can't encode character 'xa0'


問題描述

 

在寫爬蟲爬取網頁信息時,發生了以下錯誤:

 

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:在網頁源碼上替換&nbsp

 

在解析之前對r.text中的網頁源碼的&nbsp進行替換

 

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

版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM