UnicodeDecodeError utf8编解码器Python 2.7

2024-04-26 13:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我构建了一个scraper,它从csv文件读取artistnames,并通过Songkickapi从这些艺术家那里收集artistdata。但是,运行代码一段时间后,我得到以下错误:

  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 64-65: invalid continuation byte

可以下载示例数据here

我对编码比较陌生,我想知道如何解决这个错误?下面你可以找到我的代码。在

^{pr2}$
Traceback (most recent call last):
  File "C:\Users\rmlj\Dropbox\songkick\scrapers\Data\Scraper.py", line 45, in <module>
    load_artists()
  File "C:C:\Users\rmlj\Dropbox\songkick\scrapers\Data\Scraper.py".py", line 25, in load_artists
    r = requests.get(url)
  File "C:\Python27\lib\site-packages\requests\api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Python27\lib\site-packages\requests\api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 474, in request
    prep = self.prepare_request(req)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 407, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Python27\lib\site-packages\requests\models.py", line 302, in prepare
    self.prepare_url(url, params)
  File "C:\Python27\lib\site-packages\requests\models.py", line 358, in prepare_url
    url = url.decode('utf8')
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 64-65: invalid continuation byte

Tags: inpyurlreturnrequestlibpackagesline
2条回答

问题在于您的URL格式,在这个URL中,您将查询字符串作为bytes(Python 2.x上是常规的str),并将字符以非utf-8编码方式传递给requests模块,该模块又试图将其转换为utf-8unicode字符串,但失败了。在

首先,您应该让requests模块形成查询字符串,并处理最终URL的创建:

url = "http://api.songkick.com/api/3.0/search/artists.json"
r = requests.get(url, params={"query": artist, "apikey": ""})
# etc.

但是第二,你不应该混合编码至少你想在一个受伤的世界。不幸的是,内置的csv模块不能与Unicode一起工作,这可能就是您最终使用无效字符的原因。要解决这个问题,请安装unicodecsv,并将其作为一个下拉式替换(只需将您的import csv替换为import unicodecsv as csv)。在

更新:等等,再看一眼,你甚至没有使用csv。您正在逐行读取文件,并试图将其作为查询传递出去。这是你有意的行为吗?如果是这样的话,请坚持使用相同的编码:

^{pr2}$

尽可能使用unicode。请求应将url中的任何非ascii字符转换为正确的编码。在

>>> import requests  

>>> requests.get(u'http://Motörhead.com/?q=Motörhead').url  
u'http://xn motrhead-p4a.com/?q=Mot%C3%B6rhead'

如您所见,域名被编码为punycode,查询字符串使用percent-encoding。在

只要artist是一个有效的unicode字符串,这就可以了。在

^{pr2}$

如果artist是字节字符串,则必须使用正确的编码将其解码为unicode,这取决于原始输入文件的编码方式。在

artist = artist.decode('SHIFT-JIS')

相关问题 更多 >