我试图抓一个网站,但它给了我一个错误。
我使用以下代码:
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>
我该怎么做才能解决这个问题?
答案 0 :(得分:138)
我通过将.encode("utf-8")
添加到soup
修复了此问题。
这意味着print(soup)
变为print(soup.encode("utf-8"))
。
答案 1 :(得分:121)
将抓取的网页内容保存到文件时,我得到了同样的UnicodeEncodeError
。为了解决这个问题,我更换了这段代码:
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)
答案 2 :(得分:22)
在Python 3.7中,并且运行Windows 10可以正常工作(我不确定它是否可以在其他平台和/或其他版本的Python上运行)
替换此行:
with open('filename', 'w') as f:
与此:
with open('filename', 'w', encoding='utf-8') as f:
之所以起作用,是因为在使用文件时将编码更改为UTF-8,因此UTF-8中的字符能够转换为文本,而在遇到UTF-8时不会返回错误当前编码不支持的字符。
答案 3 :(得分:8)
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
答案 4 :(得分:6)
在保存get请求的响应时,在窗口10上的Python 3.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)
答案 5 :(得分:5)
对于仍然收到此错误的用户,将encode("utf-8")
添加到soup
也会解决此问题。
soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)
答案 6 :(得分:1)
即使当您尝试打印,读取/写入或打开它时,即使在编码方面我也遇到了同样的问题。如上述其他提到的那样,如果您尝试打印.encoding =“ utf-8”,则将有所帮助。
soup.encode(“ utf-8”)
如果您尝试打开抓取的数据并将其写入文件,请使用(......,encoding =“ utf-8”)
打开文件。以open(filename_csv,'w',newline ='',encoding =“ utf-8”)作为csv_file:
答案 7 :(得分:0)
如果您使用的是Windows,请尝试通过 encoding ='latin1',encoding ='iso-8859-1'或encoding ='cp1252' 例如:
csv_data = pd.read_csv(csvpath,encoding='iso-8859-1')
print(print(soup.encode('iso-8859-1')))