Python:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 12305,以及中文乱码的解决方案

本文介绍了解决Python爬虫在抓取网页时遇到的中文乱码问题,通过调整编码设置实现正确显示。

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

刚刚学习了Python没几天,看了《Python网络数据采集》这本书,准备今天在网上试验着爬一个数据,网站是UTF-8编码的,可以在网站的文件头可以看出来

所以我就按照书上的代码照着写了几行代码

 

#__author__ = 'Administrat
#coding=utf-8
from urllib.request import  urlopen
from urllib  import request
from bs4 import BeautifulSoup
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req=request.Request("网址",headers=headers)
html=urlopen(req)
bsObj=BeautifulSoup(html.read())
print(bsObj.body)

结果马上出现UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 12305: illegal multibyte sequence

 

的这个错误,所以在网上搜索教程后发现了问题的所在,附上网址http://blog.youkuaiyun.com/jim7424994/article/details/22675759点击打开链接

结果按照上述的解决方案将代码改成,添加了

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

 

 

#__author__ = 'Administrat
#coding=utf-8
from urllib.request import  urlopen
from urllib  import request
from bs4 import BeautifulSoup
import requests
import sys
impory io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')


 

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req=request.Request("网址",headers=headers)
html=urlopen(req)
bsObj=BeautifulSoup(html.read())
print(bsObj.body)


改了代码之后,虽然没有报之前的那个错误,但是打印出来文字,英文文字没有出现乱码,但是中文出现乱码的情况

 


所以在详细查看了刚刚的博客之后,将

 

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

改成

 

 

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
然后就完美中文显示
 

真是感谢上面写博客的那位大大。。。

如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

 

 

<think>我们正在处理的是使用Python的requests库时遇到的编码错误。具体错误是:`UnicodeEncodeError: 'gbk' codec can't encode character ...`。这个错误通常发生在尝试将包含非GBK字符的文本写入文件时,而文件的编码被设置为GBK(或者系统默认编码为GBK)。 用户提到之前有引用关于UnicodeDecodeError的解决办法,但当前问题是一个UnicodeEncodeError,发生在使用requests库时。我们需要考虑两种情况: 1. 当我们使用requests获取内容后,将内容写入文件时发生的编码错误。 2. 在打印内容到控制台时发生的编码错误(因为控制台可能使用GBK编码)。 核心问题:中文字符集GBK无法表示某些字符(例如,引用的错误中的字符`»`,即U+00BB)。在Windows系统中,默认编码往往是GBK,所以当文本中包含一些不在GBK字符集中的字符(如一些拉丁字符、特殊符号等)时,就会抛出此异常。 解决方案: 方案一:在写入文件时指定编码为UTF-8(推荐) 当我们使用requests获取内容后,通常我们会将内容写入文件。在打开文件时,指定编码为UTF-8,因为UTF-8可以表示所有Unicode字符。 示例代码: ```python import requests response = requests.get('http://example.com/some_page.html') # 获取文本内容,通常requests会自动根据响应头中的编码进行解码,如果没有,我们可以手动设置 # response.encoding = 'utf-8' # 如果需要可以手动设置 content = response.text with open('output.html', 'w', encoding='utf-8') as f: f.write(content) ``` 方案二:处理控制台输出时的编码错误 如果我们只是在控制台打印时遇到这个错误,那么可以尝试改变控制台的编码,或者对输出进行编码处理(例如,使用错误处理策略)。 但是,在Windows控制台直接打印Unicode字符串有时也会遇到编码问题,因为控制台默认编码是GBK。我们可以尝试以下方法: 方法1:在打印前对字符串进行转码,并忽略或替换无法编码的字符 ```python print(content.encode('gbk', errors='ignore').decode('gbk')) # 或者 print(content.encode('gbk', errors='replace').decode('gbk')) ``` 方法2:修改控制台的编码(不总是可行,但可以尝试) 在Python 3.7及以上版本,我们可以重新配置标准输出的编码: ```python import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='ignore') # 然后正常打印 print(content) ``` 但是,这种方法可能会因为控制台不支持UTF-8而显示乱码(特别是旧版Windows控制台)。 方案三:在请求时使用二进制内容,然后按需解码 如果我们不需要修改内容,可以直接保存二进制内容到文件,这样就不会有编码问题: ```python response = requests.get('http://example.com/some_page.html') content = response.content # 二进制内容 with open('output.html', 'wb') as f: f.write(content) ``` 方案四:在写入文件时使用错误处理机制 如果我们必须使用GBK编码,那么可以在打开文件时指定错误处理方式: ```python with open('output.html', 'w', encoding='gbk', errors='ignore') as f: f.write(content) # 或者用替换 with open('output.html', 'w', encoding='gbk', errors='replace') as f: f.write(content) ``` 推荐方案:通常,我们建议使用UTF-8编码来处理网页内容,因为网页内容大多使用UTF-8编码。因此,方案一和方案三是最常用且最安全的。 注意:有时,requests获取的网页编码可能识别错误,导致response.text解码不正确。我们可以通过检查response.encoding,或者手动设置编码,或者使用response.content并手动解码(如:`content = response.content.decode('utf-8')`)来确保正确解码。 引用说明:在解决编码问题时,通常需要明确是编码(Encode)还是解码(Decode)错误。本例是编码错误(EncodeError),发生在将字符串写入文件或打印时。而之前引用中的错误是解码错误(DecodeError),发生在读取文件时。两者是相反的过程[^1]。 相关问题: 1. 如何确保requests正确识别网页编码? 2. 在Windows控制台中如何正确显示中文字符(避免乱码)? 3. Python中处理文件编码的最佳实践是什么? 4. 如何批量转换文件编码(例如从GBK到UTF-8)?</think>### Python Requests 库解决 UnicodeEncodeError: 'gbk' 编码错误 当使用 Python 的 requests 库获取网页内容时遇到 `UnicodeEncodeError: 'gbk' codec can't encode character` 错误,通常发生在尝试将包含非 GBK 字符的内容写入文件或控制台时。以下是系统级解决方案: #### 核心解决方案 1. **显式指定 UTF-8 编码写入文件** 在保存响应内容时强制使用 UTF-8 编码: ```python import requests response = requests.get('https://example.com') with open('output.html', 'w', encoding='utf-8') as f: # 关键编码设置 f.write(response.text) ``` 2. **使用二进制模式保存原始内容** 避免自动解码过程: ```python response = requests.get('https://example.com') with open('output.html', 'wb') as f: # 二进制写入 f.write(response.content) # 直接保存原始字节 ``` 3. **控制台输出错误处理** 当在控制台打印时指定错误处理策略: ```python print(response.text.encode('gbk', errors='replace').decode('gbk')) # 替换非法字符 ``` #### 进阶处理 4. **强制响应文本编码** 覆盖 requests 的自动编码检测: ```python response = requests.get('https://example.com') response.encoding = 'utf-8' # 手动设置编码 print(response.text) ``` 5. **通用编码处理函数** 创建安全的文本处理函数: ```python def safe_gbk_encode(text): return text.encode('gbk', errors='backslashreplace').decode('gbk') print(safe_gbk_encode(response.text)) ``` 6. **环境级解决方案** 修改系统默认编码(Windows 临时方案): ```cmd :: 在CMD中执行 set PYTHONIOENCODING=utf-8 python your_script.py ``` #### 错误原因分析 此错误发生在: 1. 目标网页包含 GBK 编码不支持的字符(如特殊符号 ») 2. Windows 系统默认使用 GBK 编码 3. 当尝试将 Unicode 字符串转换为 GBK 时遇到非法字符序列[^1] > **最佳实践**:始终在文件操作中显式指定 `encoding='utf-8'`,网页内容处理优先使用 `response.content` 二进制模式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值