| 问题描述   在写爬虫爬取网页信息时,发生了以下错误:   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 版权声明:本文为博主原创文章,转载请附上博文链接! |