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
相关产品推荐
相关产品推荐

