【问题标题】:Why I'm getting "UnicodeEncodeError: 'charmap' codec can't encode character '\u25b2' in position 84811: character maps to <undefined>" error?为什么我收到“UnicodeEncodeError: 'charmap' codec can't encode character '\u25b2' in position 84811: character maps to <undefined>”错误?
【发布时间】:2022-04-21 03:34:04
【问题描述】:

运行此代码时出现 UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' in position 756: character maps to 错误::

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

输出是:

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>

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

【问题讨论】:

标签: python-3.x web-scraping beautifulsoup encoding


【解决方案1】:

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

Traceback ...
  File "...\cp1252.py", ...
UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' ...

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

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

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

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

      print(soup.prettify().encode('cp1252', errors='ignore'))
    

【讨论】:

    【解决方案2】:

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

    text = text.encode('utf-8').decode('ascii', 'ignore')
    

    python 3 的等价物很简单:

    text = str(text)
    

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

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

    否则正常:

    r = requests.get('https://stackoverflow.com')
    soup = BeautifulSoup(r.content, 'lxml')
    print soup
    

    (我认为这不会有任何错误。)

    【讨论】:

    • 你是说把汤转成字符串然后用美化吗?
    • 兄弟通过运行你的代码得到一个新错误,我得到以下输出:``` Traceback(最近一次调用最后):文件“c:\ Users \ Asus \ Documents \ Hello World \Web Scraping\reddit.py”,第 6 行,在 print(soup) 文件“C:\Users\Asus\AppData\Local\Programs\Python\Python38\lib\encodings\cp1252.py”,第 19 行, 在编码返回 codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' in position 734: character maps to ```
    【解决方案3】:

    对于python3,你可以使用:

    text = str(text.encode('utf-8'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2017-05-10
      • 2014-09-27
      • 2020-08-05
      相关资源
      最近更新 更多