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

我正在使用以下代码:

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>

我该怎么补救呢?


当前回答

我通过添加.encode("utf-8")来解决这个问题。

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

其他回答

从Python 3.7开始, 将环境变量PYTHONUTF8设置为1

下面的脚本还包括其他有用的变量,用于设置系统环境变量。

setx /m PYTHONUTF8 1
setx PATHEXT "%PATHEXT%;.PY" ; In CMD, Python file can be executed without extesnion.
setx /m PY_PYTHON 3.10 ; To set default python version for py

我通过添加.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)
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

即使是我也面临着同样的编码问题,当你试图打印它,读/写它或打开它时。正如上面提到的,如果你想打印它,添加.encoding="utf-8"会有帮助。

soup.encode(“utf - 8”)

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

open(filename_csv, 'w', newline= ",encoding="utf-8") as csv: