【发布时间】:2018-09-10 04:45:46
【问题描述】:
当我尝试导出 CSV 文件时出现 Unicode 错误(网络抓取,我使用的是 Beautifulsoup 并同时导入了 CSV 和 Beautifulsoup)。该代码由完全支持 UTF-8 的 Mac Linux 使用,但我使用的是 Windows。错误显示为
> UnicodeEncodeError Traceback (most recent call last) in () 71
> 'ranking_title': ranking_title, ---> 72 'ranking_category':
> ranking_category}) 73
>
> ~\Anaconda3\lib\csv.py in writerow(self, rowdict) 154 def
> writerow(self, rowdict): --> 155 return
> self.writer.writerow(self._dict_to_list(rowdict)) 156
>
> ~\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final) 18
> def encode(self, input, final=False): ---> 19 return
> codecs.charmap_encode(input,self.errors,encoding_table)[0] 20
>
> UnicodeEncodeError: 'charmap' codec can't encode characters in
> position 299-309: character maps to
适用于 Mac 的原始代码是:
def get_page(url):
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
mainpage = response.read().decode('utf8')
return mainpage
我尝试在工作表的开头解码 cp1252 并编码 UTF-8:
def get_page(url):
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
mainpage = response.read().decode('cp1252').encode('utf8')
return mainpage
但它不起作用。请帮忙。
【问题讨论】:
-
看起来问题不在于您如何读取(解码)数据,而在于您如何编写它(编码,参见错误消息)。
get_page函数看起来不错,但您应该显示打开文件以将 CSV 输出写入其中的代码部分。 -
你能提供你正在使用的网站的网址吗?
-
@lenz 非常感谢。我会尽快提供。现在我遇到了其他一些随机错误。
-
抛弃
urllib.request。使用requests模块。它为您完成所有解码,您可以专注于您真正想做的事情。 (当然,您可以使用urllib重新实现requests所做的所有事情。但是对于初学者,您需要注意Content-Type响应标头而不是硬编码单个编码。但是这样做真的是您的目标在这里,还是您真的想下载和使用数据?) -
@Tomalak 关于
requests让您的生活总体上更轻松当然是正确的。恐怕它不会解决这个特殊问题,因为解码显然成功了(没有UnicodeDecodeError)。我怀疑你open没有声明encoding=参数的输出文件,所以 Python 默认使用特定于平台的默认编解码器“CP-1252”,它显然不支持数据中的所有字符。
标签: python utf-8 web-scraping beautifulsoup cp1252