为什么我收到“UnicodeEncodeError: 'charmap' codec can't encode character '\u25b2' in position 84811: character maps to <undefined>”错误?

Asi*_*dra 5 encoding beautifulsoup web-scraping python-3.x

我收到UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' in position 756: character maps to error while running this code::

from bs4 import BeautifulSoup
import requests
r = requests.get('https://stackoverflow.com').text
soup = BeautifulSoup(r, 'lxml')
print(soup.prettify())

Run Code Online (Sandbox Code Playgroud)

输出是:

Traceback (most recent call last):
  File "c:\Users\Asus\Documents\Hello World\Web Scraping\st.py", line 5, in <module>
    print(soup.prettify())
  File "C:\Users\Asus\AppData\Local\Programs\Python\Python38\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' in position 756: character maps to <undefined>

Run Code Online (Sandbox Code Playgroud)

我在 vs 代码中使用 python 3.8.1 和 UTF-8。如何解决这个问题?

小智 9

对于 python3,您可以使用:

text = str(text.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)


vai*_*v s 8

你可以自己探索一点......但是对于python 2.7,我通常做的是使用它来清理我的文本:

text = text.encode('utf-8').decode('ascii', 'ignore')
Run Code Online (Sandbox Code Playgroud)

与此等效的 python 3 很简单:

text = str(text)
Run Code Online (Sandbox Code Playgroud)

对于你的情况,试试这个:

r = requests.get('https://stackoverflow.com').text.encode('utf8').decode('ascii', 'ignore')
Run Code Online (Sandbox Code Playgroud)

否则通常:

r = requests.get('https://stackoverflow.com')
soup = BeautifulSoup(r.content, 'lxml')
print soup
Run Code Online (Sandbox Code Playgroud)

(我不认为这应该给出任何错误。)


Ser*_*sta 8

完整的错误消息中有提示......我将在这里保留似乎最重要的内容:

Traceback ...
  File "...\cp1252.py", ...
UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' ...
Run Code Online (Sandbox Code Playgroud)

错误是由print调用引起的。在您文本的某个地方,您有一个零宽度空格字符 (Unicode U+200B),如果您打印到 Windows 控制台,则该字符串会在内部编码到 Windows 控制台代码页(此处为 cp1252)中。并且该代码页中没有表示零宽度空间。顺便说一句,默认控制台在 Windows 中并不是真正的 unicode 友好的。

在 Windows 控制台中几乎没有什么可做的。我建议您尝试以下解决方法之一:

  • 不要打印到控制台,而是写入 (utf8) 文件。然后,您将能够使用支持 utf8 的文本编辑器(如记事本 ++)阅读它

  • 在打印之前手动编码任何内容,使用errors='ignore'errors='replace'。这样,可能有问题的字符将被忽略并且不会出现错误

      print(soup.prettify().encode('cp1252', errors='ignore'))
    
    Run Code Online (Sandbox Code Playgroud)