Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 637|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-7 15:44:21 | 显示全部楼层 |阅读模式

    问题描述

     

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

     

    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

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-20 22:21 , Processed in 0.086108 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表