Python爬虫踩坑:UnicodeEncodeError: ‘gbk‘ codec can‘t encode character 全网最有效解的决方法

在这里插入图片描述

1. 问题描述

  • 我在网上看到了一本喜欢的小说,希望用爬虫把正本小说下载下来。
    在这里插入图片描述
    于是写下了这样一段代码:
from urllib import request

headers = {
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; ."
                  "NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)"}

url_menu = "https://www.biqu100.com/3_3075/"

req = request.Request(url=url_menu, headers=headers)
res = request.urlopen(req, timeout=5)
html = res.read().decode("utf-8")
print(html)

可是解释器报错:UnicodeEncodeError: ‘gbk’ codec can’t encode character …
在这里插入图片描述
在这里插入图片描述

2. 解决方法

  • 按照网上找到的很多方法进行了尝试,结果均无效,但是作为笔记,在此还是做一下记录。
  • 对于第一次遇到这个问题的同学,建议从第一步开始仔细排查一遍;
  • 对于在网上找了很久解决方案的同学,可以直接跳到文章最后,查看最终办法

2.1 步骤1

  • 检查解码格式
  • 首先要确定从网上爬下来的这一段二进制流应该用什么格式来解码。如果这是一串gbk格式的字节流,但我们用utf-8来解码,肯定无法解析。
  • 在网页上点击鼠标右键,点击“检查”,在html中的head里找到“meta charset”,这一项就是正确的解码格式。
    在这里插入图片描述
  • 如果在解码时已经指定了正确的格式,如:
html = res.read().decode("utf-8")
  • 结果依旧报错,则参照步骤二。

2.2 步骤2

  • 忽略异常字符
  • 虽然解码格式已经确认了,但是由于获取到的二进制流中,可能存在错误信息,或其中夹杂的部分字符根本就不是文字信息,各种各样的原因都有可能导致我们解码错误。
  • 关于这个问题,网上有很多解决方法。在这里我记录一个最简单的。
  • 我们在解码的时候,调用的是StreamReader类的decode函数。
    在这里插入图片描述
  • 这个函数的error参数可以指定发生错误时,应该采取的处理方式。我们在这个参数里填上"ignore",那么,在解码过程中,遇到无法解析的字符时,就会自动跳过,从而完成整体解析。
  • 有些同学做到这一步的时候,问题应该就已经解决了,但是我踩坑踩得比较深,即使做到这一步了,问题还是没有解决。
    在这里插入图片描述

2.3 步骤3

  • PyCharm设置
  • 我注意到,我已经用utf-8来解码了,但是解释器的报错信息还是暴出gbk方面的解码错误。
  • 会对这串二进制流进行处理的只有三方,一方是Chrome浏览器,一方是Python解释器,另一方是PyCharm,事实证明Chrome浏览器用utf-8格式是可以解析的,那么格式肯定是对的,StreamReader类已经考虑到了异常字符的处理方式,所以Python本身也不会有问题,那么问题只有可能出在PyCharm的设置上了。
  • 点击File -> Settings…
    在这里插入图片描述
    找到Project Encoding项目,发现这一项果然写死了GBK格式,将其修改为UTF-8,然后点击OK。
    在这里插入图片描述
  • 大功告成
    在这里插入图片描述
    在这里插入图片描述
<think>好的,我现在需要帮用户在VSCode中遇到的UnicodeEncodeError问题,具体是关于GBK编码无法处理字符\u200c的情况。首先,我得回想一下之前处理过类似的编码问题。根据用户提供的引用内容,问题通常出现在使用GBK编码处理非GBK字符时,比如零宽度空格\u200b或者\u200c这样的字符。 首先,用户是在VSCode中遇到这个错误的,可能是在运行Python脚本时,尤其是处理文本输出的时候。比如,打印到控制台或者写入文件时,如果默认编码是GBK,遇到无法编码的字符就会报错。我需要考虑几个可能的方案: 1. **修改控制台编码为UTF-8**:因为VSCode的控制台默认可能使用系统的GBK编码,改成UTF-8可以支持更多字符。用户可能需要配置VSCode的终端设置,或者修改系统环境变量。 2. **替换或删除无法编码的字符**:在代码中,处理字符串时,先过滤掉这些特殊字符。比如使用replace方法或者正则表达式去除\u200c之类的字符。 3. **显式指定文件编码**:如果问题出现在写入文件时,可以在打开文件时指定encoding='utf-8',这样避免使用默认的GBK编码。 4. **修改Python默认编码**:虽然不推荐,但有时临时修改sys.stdout的编码为UTF-8可能有效,不过要注意这种方式可能在其他环境中有问题。 接下来,我需要验证这些方法的可行性。比如,修改VSCode终端的编码可能需要用户手动设置,或者在代码中添加环境变量。例如,在Python脚本开头设置环境变量PYTHONIOENCODING为utf-8。另外,处理字符串时,替换掉非常见字符也是一个常见做法,比如使用s.replace('\u200c', '')。 还要考虑到用户的具体情况,比如他们的脚本是在读取外部数据还是生成数据,如果是爬虫,可能需要清洗数据中的特殊字符。此外,确保文件操作时使用正确的编码参数,比如open函数中的encoding参数。 然后,需要将这些方案分步骤说明,确保用户能一步步操作。同时,要提醒用户不同的场景可能需要不同的方法,比如输出到控制台和写入文件的不同处理方式。 后,生成相关问题的时候,要围绕编码问题、Python环境配置、字符处理等方向,帮助用户扩展理,避免未来遇到类似问题。</think>### VSCode中UnicodeEncodeError: 'gbk' codec问题的分步方案 #### 1. 修改VSCode终端编码为UTF-8 **步骤**: - 打开VSCode设置(`Ctrl+,`),搜索`Terminal > Integrated: Env` - 点击`Edit in settings.json`,添加环境变量配置: ```json "terminal.integrated.env.windows": { "PYTHONIOENCODING": "utf-8" } ``` - 重启VSCode终端 **原理**:强制Python输出使用UTF-8编码,避免与系统默认GBK编码冲突[^1][^2]。 #### 2. 代码中显式指定编码 **场景**:写入文件时触发错误 **方案**: 在文件操作时明确指定`encoding='utf-8'`: ```python with open("output.txt", "w", encoding='utf-8') as f: # 关键参数 f.write(text) ``` #### 3. 过滤特殊字符 **场景**:处理含零宽度空格(如`\u200b`、`\u200c`)的文本 **代码示例**: ```python # 方法1:直接替换 clean_text = raw_text.replace('\u200c', '') # 方法2:正则过滤(推荐) import re clean_text = re.sub(r'[\u200b-\u200d]', '', raw_text) # 清除零宽度空格/连接符 ``` #### 4. 修改Python运行时编码(临时方案) 在代码开头添加: ```python import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # 重定向标准输出 ``` **注意**:此方法可能影响其他依赖标准输出的模块[^3]。 #### 验证方案 ```python # 测试用例 test_str = "测试字符\u200c" print(test_str) # 原样输出则成功,报错则需检查配置 ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值