我构建了一个scraper,它从csv文件读取artistnames
,并通过Songkick
api从这些艺术家那里收集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
问题在于您的URL格式,在这个URL中,您将查询字符串作为
bytes
(Python 2.x上是常规的str
),并将字符以非utf-8编码方式传递给requests
模块,该模块又试图将其转换为utf-8unicode字符串,但失败了。在首先,您应该让
requests
模块形成查询字符串,并处理最终URL的创建:但是第二,你不应该混合编码至少你想在一个受伤的世界。不幸的是,内置的
csv
模块不能与Unicode一起工作,这可能就是您最终使用无效字符的原因。要解决这个问题,请安装unicodecsv,并将其作为一个下拉式替换(只需将您的import csv
替换为import unicodecsv as csv
)。在更新:等等,再看一眼,你甚至没有使用csv。您正在逐行读取文件,并试图将其作为查询传递出去。这是你有意的行为吗?如果是这样的话,请坚持使用相同的编码:
^{pr2}$尽可能使用unicode。请求应将url中的任何非ascii字符转换为正确的编码。在
如您所见,域名被编码为punycode,查询字符串使用percent-encoding。在
只要
^{pr2}$artist
是一个有效的unicode字符串,这就可以了。在如果
artist
是字节字符串,则必须使用正确的编码将其解码为unicode,这取决于原始输入文件的编码方式。在相关问题 更多 >
编程相关推荐