UnicodeEncodeError:“ charmap”编解码器无法编码字符


205

我正在尝试抓取一个网站,但这给我一个错误。

我正在使用以下代码:

import urllib.request
from bs4 import BeautifulSoup

get = urllib.request.urlopen("https://www.website.com/")
html = get.read()

soup = BeautifulSoup(html)

print(soup)

我收到以下错误:

File "C:\Python34\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 70924-70950: character maps to <undefined>

我该怎么做才能解决此问题?

Answers:


256

UnicodeEncodeError将抓取的网页内容保存到文件中时,我得到的是相同的。为了解决这个问题,我替换了以下代码:

with open(fname, "w") as f:
    f.write(html)

有了这个:

import io
with io.open(fname, "w", encoding="utf-8") as f:
    f.write(html)

使用io可以向后兼容Python 2。

如果只需要支持Python 3,则可以改用内置open函数:

with open(fname, "w", encoding="utf-8") as f:
    f.write(html)

6
在mac(python 3)中,无需编码即可打开就可以完美工作,但在windows(w10,python3)中则不行。只是以这种方式工作,并带有encoding =“ utf-8”参数。
xtornasol512

3
谢谢。它为我工作,我正在处理xml文件,并将xml.toprettyxml()的结果写入一个新文件
Luis Cabrera Benito,

1
这应该是可接受的答案,因为它将最终将字符串写入输出,而不是字节的字符串表示形式。
Shirkan

OP请求读取文件,但是不写入文件。该问题似乎与控制台有关。
NaturalBornCamper

187

我通过添加将.encode("utf-8")其修复soup

那意味着print(soup)变成print(soup.encode("utf-8"))


3
不要在脚本中对环境(例如控制台)的字符编码进行硬编码,而是直接打印Unicode
jfs 2015年

这只是打印bytes对象的代表,\x如果有很多UTF-8编码的文本,它将作为一堆混乱的序列打印。我建议使用win_unicode_console@JFSebastian建议的。
Eryk Sun

2
我使用了上述解决方案,但仍然遇到了问题:类MyStreamListener(tweepy.StreamListener):def on_status(自身,状态):print(str(status.encode(“ utf-8”)))UnicodeEncodeError:'charmap'编解码器可以' t在位置87编码字符'\ u2019':字符映射到<undefined>
Vivek

2
而是打印出来b'\x02x\xc2\xa9'(一个字节对象)
MilkyWay90

1
print(soup.encode("utf-8"))为我工作,但在此之前我还必须添加with open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
TheWalkingData

44

在Python 3.7中,并且运行Windows 10可以正常工作(我不确定它是否可以在其他平台和/或其他版本的Python上运行)

替换此行:

with open('filename', 'w') as f:

有了这个:

with open('filename', 'w', encoding='utf-8') as f:

之所以起作用,是因为在使用文件时将编码更改为UTF-8,因此能够将UTF-8中的字符转换为文本,而不是遇到UTF-8字符时返回错误。当前编码不支持。


1
print(soup)return \ xd0 \ xbf \ xd0 \ xbe \ xd0 \ xb6 \ xd0 \ xb0 \ xd0 \ xbb \ xd1 \ x83 \ xd0 \ xb9 \ xd
Coffee inTime

12

在保存get请求的响应时,在窗口10上的Python 3.7上引发了相同的错误。从URL接收到的响应的编码为UTF-8,因此始终建议检查编码,以便可以传递相同的编码以避免此类琐碎的问题因为它确实浪费了很多生产时间

import requests
resp = requests.get('https://en.wikipedia.org/wiki/NIFTY_50')
print(resp.encoding)
with open ('NiftyList.txt', 'w') as f:
    f.write(resp.text)

当我用open命令添加encoding =“ utf-8”时,它以正确的响应保存了文件

with open ('NiftyList.txt', 'w', encoding="utf-8") as f:
    f.write(resp.text)

10

甚至我在尝试打印,读取/写入或打开它时遇到的编码问题都相同。如上文所述,如果您尝试打印.encoding =“ utf-8”,则将有所帮助。

soup.encode(“ utf-8”)

如果您尝试打开抓取的数据并将其写入文件,请使用(......,encoding =“ utf-8”)打开文件

使用open(filename_csv,'w',newline ='',encoding =“ utf-8”)作为csv_file:


6

对于那些仍然收到此错误,添加encode("utf-8")soup也将解决这个问题。

soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)

2
soupBeautifulSoup执行
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.