问题:UnicodeEncodeError:“ charmap”编解码器无法编码字符
我正在尝试抓取一个网站,但这给我一个错误。
我正在使用以下代码:
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
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)
回答 1
我通过添加将.encode("utf-8")
其修复soup
。
那意味着print(soup)
变成print(soup.encode("utf-8"))
。
回答 2
在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
在保存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)
回答 4
甚至我在尝试打印,读取/写入或打开它时遇到的编码问题都相同。如上文所述,如果您尝试打印.encoding =“ utf-8”,则将有所帮助。
soup.encode(“ utf-8”)
如果您尝试打开抓取的数据并将其写入文件,请使用(……,encoding =“ utf-8”)打开文件
使用open(filename_csv,’w’,newline =”,encoding =“ utf-8”)作为csv_file:
回答 5
对于那些仍然收到此错误,添加encode("utf-8")
到soup
也将解决这个问题。
soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)