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

在使用Python爬虫抓取包含中文的网页信息时,遇到UnicodeEncodeError异常,特别是gbk编码无法处理特定Unicode字符的问题。本文详细解释了错误原因,并提供了两种解决方案,包括在网页源码级别替换特殊字符和在解析后的Unicode文本中进行替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

 

在写爬虫爬取网页信息时,发生了以下错误:

 

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)

---------------------

作者:曾记否?

来源:优快云

原文:https://blog.youkuaiyun.com/qq_38607035/article/details/82595170

版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/mhj666/p/11052120.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值