Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnicodeEncodeError:&x27;charmap';编解码器可以';t编码字符_Python_Beautifulsoup_Urllib - Fatal编程技术网

Python UnicodeEncodeError:&x27;charmap';编解码器可以';t编码字符

Python UnicodeEncodeError:&x27;charmap';编解码器可以';t编码字符,python,beautifulsoup,urllib,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

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

我正在使用以下代码:

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>
文件“C:\Python34\lib\encodings\cp1252.py”,第19行,在encode中
返回codecs.charmap\u encode(输入、自身错误、编码表)[0]
UnicodeEncodeError:“charmap”编解码器无法对位置70924-70950中的字符进行编码:字符映射到

我能做些什么来解决这个问题?

我通过在
汤中添加
.encode(“utf-8”)
来解决这个问题


这意味着
print(soup)
变为
print(soup.encode(“utf-8”))
对于仍然出现此错误的用户,将
encode(“utf-8”)
添加到
soup
中也会解决此问题

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

当我将抓取的web内容保存到一个文件中时,我得到了相同的
unicodeincoder错误。为了修复它,我替换了以下代码:

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)

如果您的文件是以UTF-8以外的格式编码的,请指定Python 3.7中的
编码
的实际编码,并运行Windows 10,这样做是有效的(我不确定它是否能在其他平台和/或其他版本的Python上工作)

替换此行:

打开('filename','w')作为f:

为此:

将open('filename','w',encoding='utf-8')作为f:


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

在保存get请求的响应时,在窗口10上的Python3.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)

即使是我,在打印、读/写或打开时也会遇到同样的编码问题。如上所述,如果您试图打印,添加.encoding=“utf-8”将有所帮助

汤编码(“utf-8”)

如果您试图打开刮取的数据并可能将其写入文件,则使用(……,encoding=“utf-8”)打开该文件

打开(文件名为“w”,换行符为“”,编码为“utf-8”)作为csv文件:


如果您使用的是windows,请尝试传递encoding='latin1',encoding='iso-8859-1'或encoding='cp1252' 例如:

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

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


另外:复制此错误有点痛苦,因此也将此保留在此处,以防您需要在计算机上复制此错误:

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

不要在脚本中硬编码环境(例如控制台)的字符编码,这只是打印
字节
对象的repr,如果有大量UTF-8编码的文本,它将打印成一堆
\x
序列。我建议使用@J.F.Sebastian建议的
win\u unicode\u控制台
。我使用了上述解决方案,但遇到了以下问题:class MyStreamListener(tweepy.StreamListener):def on_status(self,status):print(str(status.encode(“utf-8”))UnicodeEncodeError:“charmap”编解码器无法在位置87对字符“\u2019”进行编码:字符映射到这使它打印出
b'\x02x\xc2\xa9'
(一个字节对象),而不是
print(soup.encode(“utf-8”)
对我有效,但在此之前,我还必须用open(“f\u name”,encoding=“utf-8”)添加
,作为f:soup=BeautifulSoup(f,mac(python3)中的“html.parser”)
完全可以在不编码的情况下打开,但在windows(w10,python3)中不是一个选项。只需使用encoding=“utf-8”param以这种方式工作。谢谢。这对我很有效,我正在处理xml文件并编写xml.toprettyxml()的结果在新文件中,这应该是可接受的答案,因为它最终将向输出写入字符串,而不是字节的字符串表示形式。不过,请不要写入文件。问题似乎与控制台相关。这是可行的。但您不必使用io,只需包含
encoding=“utf-8“
在打开函数
soup
中,执行此操作后,它不再是
BeautifulSoup
对象,因此无法对其进行操作或搜索打印(soup)返回\xd0\xbf\xd0\xb6\xd0\xb0\xb0\xd0\xd0\xbb\xd1\x83\xd0\xb9\xd这很完美;我在Windows系统上使用Python调试器(pdb)查看使用utf-8且包含大量表情符号的源代码时,遇到了这个错误。每次我执行“list”命令查看我所在的位置时,都会出现“charmap”错误。设置这两个环境变量使我的调试非常顺利。这很完美,解决了问题,非常感谢
sys.stdin.reconfigure
在Python 3.9.0上无效,它抛出
AttributeError:'StdInputFile'对象在Windows 10上没有属性'reconfigure'
,使用GIT BASH设置上述环境变量不起作用,但是,在实际Python代码文件中设置两行确实起作用:
sys.stdin.reconfigure(encoding='utf-8')系统标准输出重新配置(encoding='utf-8')
set PYTHONIOENCODING=utf-8
set PYTHONLEGACYWINDOWSSTDIO=utf-8
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
set PYTHONIOENCODING=windows-1252
set PYTHONLEGACYWINDOWSSTDIO=windows-1252