You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取日文网站打印文本触发charmap编码UnicodeEncodeError报错

问题背景

正在从日本动漫网站爬取动漫分类信息,目标提取CSS选择器li.btnList a匹配的元素文本,初始实现代码如下:

from bs4 import BeautifulSoup
import requests
import lxml

D_ANIME_URL = "https://animestore.docomo.ne.jp/animestore/gen_sel_pc"

response = requests.get(url=D_ANIME_URL)
text = response.text
soup = BeautifulSoup(text, "lxml")
genre = soup.select("li.btnList a")
for gen in genre:
    print(gen.text)

遇到的问题

运行代码后触发UnicodeEncodeError报错:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 5-15: character maps to <undefined>

尝试使用gen.text.encode('utf-8')处理文本后,仅返回无法直接识读的字节类型数据,无法满足使用需求。
完整报错栈如下:

Traceback (most recent call last):
  File "c:\Development\ani-gen\sandbox.py", line 12, in <module>
    print(gen.text)
  File "C:\Users\...\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 5-10: character maps to <undefined>
报错原因

这个报错和网页爬取、内容解析逻辑无关,是Windows系统终端默认使用cp1252编码(即报错中提到的charmap编码),该编码不支持日文字符映射,打印日文内容时就会抛出编码错误。之前用encode('utf-8')得到的是字节类型对象,自然无法直接作为可读文本使用。

解决方法
  • 最简便的修复方式:在代码最开头添加两行配置,强制Python标准输出使用UTF-8编码,修改后直接打印文本即可正常显示日文,不需要额外转码:
import sys
sys.stdout.reconfigure(encoding='utf-8')
  • 终端临时修复:运行脚本前,先在当前终端执行命令chcp 65001,将终端当前代码页切换为UTF-8编码,再运行脚本就不会出现编码报错。
  • 写入文件注意事项:如果需要把爬取到的分类信息存储到本地文件,打开文件时必须显式指定编码为UTF-8,避免写入时触发同类编码错误,示例代码:
with open("anime_genre.txt", "w", encoding="utf-8") as f:
    for gen in genre:
        f.write(f"{gen.text}\n")

补充:如果遇到爬取到的内容本身是乱码的情况,可以在获取响应后添加response.encoding = response.apparent_encoding,让requests自动识别网页正确编码,你当前遇到的报错不需要加这行配置。

内容的提问来源于stack exchange,提问作者TomoDevelops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:48:37