zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    ToString格式化
    [转]vc中socket编程步骤
    [XAML学习资料] 验证用户提供的数据ValidationRule
    VS2008下安装boost
    [ASP.NET用户验证一]Forms验证
    VISTA IIS Worker Process 已停止工作 解决办法
    [MFC入门二]四种不同对象
    删除TFS项目
    [WPF学习资料] WPF简介
    IIS7下配置PHP5
  • 原文地址:https://www.cnblogs.com/mhj666/p/11052120.html
Copyright © 2011-2022 走看看