UnicodeEncodeError:'charmap'编解码器无法编码字符

时间:2014-11-23 18:47:01

标签: python beautifulsoup urllib

我试图抓一个网站,但它给了我一个错误。

我使用以下代码:

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>

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

8 个答案:

答案 0 :(得分:138)

我通过将.encode("utf-8")添加到soup修复了此问题。

这意味着print(soup)变为print(soup.encode("utf-8"))

答案 1 :(得分:121)

将抓取的网页内容保存到文件时,我得到了同样的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)

答案 2 :(得分:22)

在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时不会返回错误当前编码不支持的字符。

答案 3 :(得分:8)

set PYTHONIOENCODING=utf-8
set PYTHONLEGACYWINDOWSSTDIO=utf-8

您可能需要设置第二个环境变量PYTHONLEGACYWINDOWSSTDIO

或者,这可以用代码完成(尽管似乎建议通过env vars完成):

sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')

另外: 重现此错误有点痛苦,因此也请留在此处,以防您需要在计算机上重现此错误:

set PYTHONIOENCODING=windows-1252
set PYTHONLEGACYWINDOWSSTDIO=windows-1252

答案 4 :(得分:6)

在保存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)

答案 5 :(得分:5)

对于仍然收到此错误的用户,将encode("utf-8")添加到soup也会解决此问题。

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

答案 6 :(得分:1)

即使当您尝试打印,读取/写入或打开它时,即使在编码方面我也遇到了同样的问题。如上述其他提到的那样,如果您尝试打印.encoding =“ utf-8”,则将有所帮助。

  

soup.encode(“ utf-8”)

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

打开文件。
  

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

答案 7 :(得分:0)

如果您使用的是Windows,请尝试通过 encoding ='latin1',encoding ='iso-8859-1'或encoding ='cp1252' 例如:

csv_data = pd.read_csv(csvpath,encoding='iso-8859-1')
print(print(soup.encode('iso-8859-1')))