我正在试图抓一个网站,但它给了我一个错误.
我正在使用以下代码:
import urllib.request
from bs4 import BeautifulSoup
get = urllib.request.urlopen("https://www.website.com/")
html = get.read()
soup = BeautifulSoup(html)
print(soup)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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>
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?
当我尝试在Windows控制台中打印Unicode字符串时,出现UnicodeEncodeError: 'charmap' codec can't encode character ....错误.我认为这是因为Windows控制台不接受仅Unicode字符.最好的方法是什么??在这种情况下,有什么方法可以让Python自动打印而不是失败?
编辑: 我正在使用Python 2.5.
注意: @ LasseV.Karlsen回答带有复选标记有点过时(从2008年开始).请谨慎使用下面的解决方案/答案/建议!!
截至今天(2016年1月6日),@ JFSebastian答案更为相关.
首先,我将Windows CMD编码更改为utf-8并运行Python解释器:
chcp 65001
python
Run Code Online (Sandbox Code Playgroud)
然后我尝试在其中打印一个unicode sting,当我这样做时,Python以一种特殊的方式崩溃(我只是在同一个窗口中得到一个cmd提示符).
>>> import sys
>>> print u'ëèæîð'.encode(sys.stdin.encoding)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会发生以及如何使它工作?
UPD:sys.stdin.encoding退货'cp65001'
UPD2:我刚才发现这个问题可能与utf-8使用多字节字符集这一事实有关(kcwu就此提出了一个很好的观点).我尝试使用'windows-1250'运行整个示例并得到'ëea?'.Windows-1250使用单字符集,因此它适用于它理解的字符.但是我仍然不知道如何让'utf-8'在这里工作.
UPD3:哦,我发现它是一个已知的Python bug.我想会发生的事情是Python将cmd编码复制为'cp65001到sys.stdin.encoding并尝试将其应用于所有输入.由于它无法理解'cp65001',因此它会在包含非ascii字符的任何输入上崩溃.
我从来没有完全包围编码和解码unicode到其他格式(utf-8,utf-16,ascii等),但我已经到了一个令人困惑和令人沮丧的墙.我想要做的是从python模块打印utf-8卡符号(♠,♥,♦,♣)到Windows控制台.我正在使用的控制台是git bash,我使用console2作为前端.我尝试/阅读了下面的一些方法,到目前为止还没有任何工作.让我知道我正在做的事情是否可能以及正确的做法.

从python模块尝试同样的事情.
当我执行.py时,这就是结果.
print(u'?')
UnicodeEncodeError: 'charmap' codec can't encode character '\u2660' in position 0: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)尝试编码♠.这让我回到了用utf-8编码的unicode集,但仍然没有spade符号.
text = '?'
print(text.encode('utf-8'))
b'\xe2\x99\xa0'
Run Code Online (Sandbox Code Playgroud)我觉得我错过了一步或者没有理解整个编码/解码过程.我读过这个,这个,这个.最后一个页面的提示包裹sys.stdout的入代码,但该文章说使用stdout是不必要的,点使用的编解码器模块的另一页.
我很困惑!我觉得很难找到关于这个主题的思想质量文档,希望有人可以清除它.任何帮助总是受到赞赏!
奥斯汀
我使用编码utf-8创建了一个包.
调用函数时,它返回一个DataFrame,其中的列以utf-8编码.
在命令行中使用IPython时,显示此表的内容时没有任何问题.使用Notebook时,它会因错误而崩溃'utf8' codec can't decode byte 0xe7.我在下面附上了一个完整的追溯.
使用Notebook的正确编码是什么?
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-13-92c0011919e7> in <module>()
3 ver = verif.VerificacaoNA()
4 comp, total = ver.executarCompRealFisica(DT_INI, DT_FIN)
----> 5 comp
c:\Python27-32\lib\site-packages\ipython-0.13.1-py2.7.egg\IPython\core\displayhook.pyc in __call__(self, result)
240 self.update_user_ns(result)
241 self.log_output(format_dict)
--> 242 self.finish_displayhook()
243
244 def flush(self):
c:\Python27-32\lib\site-packages\ipython-0.13.1-py2.7.egg\IPython\zmq\displayhook.pyc in finish_displayhook(self)
59 sys.stdout.flush()
60 sys.stderr.flush()
---> 61 self.session.send(self.pub_socket, self.msg, ident=self.topic)
62 self.msg = None
63
c:\Python27-32\lib\site-packages\ipython-0.13.1-py2.7.egg\IPython\zmq\session.pyc in send(self, stream, msg_or_type, content, parent, ident, buffers, subheader, track, header)
557 …Run Code Online (Sandbox Code Playgroud) 如何正确阅读日文和中文字符.我正在使用python 2.5.输出显示为"E:\Test\?????????"
path = r"E:\Test\?????????"
t = path.encode()
print t
u = path.decode()
print u
t = path.encode("utf-8")
print t
t = path.decode("utf-8")
print t
Run Code Online (Sandbox Code Playgroud)