Python 异常:UnicodeDecodeError:“ascii”编解码器无法解码字节0xa7

7
我正在使用Python的Scrapy框架,并且在一个Python项目管道中有这段代码。
def process_item(self, item, spider):
        import pdb; pdb.set_trace()
        ID = str(uuid.uuid5(uuid.NAMESPACE_DNS, item['link']))

我得到了这个错误:
        Traceback (most recent call last):
          File "C:\Python27\lib\site-packages\scrapy-0.20.2-py2.7.egg\scrapy\mid
dleware.py", line 62, in _process_chain
            return process_chain(self.methods[methodname], obj, *args)
          File "C:\Python27\lib\site-packages\scrapy-0.20.2-py2.7.egg\scrapy\uti
ls\defer.py", line 65, in process_chain
            d.callback(input)
          File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 3
82, in callback
            self._startRunCallbacks(result)
          File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 4
90, in _startRunCallbacks
            self._runCallbacks()
        --- <exception caught here> ---
          File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 5
77, in _runCallbacks
            current.result = callback(current.result, *args, **kw)
          File "General_Spider_code_version_2\pipelines.py", line 7, in process_
item
            ID = str(uuid.uuid5(uuid.NAMESPACE_DNS, item['link']))
          File "C:\Python27\lib\uuid.py", line 549, in uuid5
            hash = sha1(namespace.bytes + name).digest()
        exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa7 in p
osition 1: ordinal not in range(128)

我尝试调试item['link'],这是调试结果。
-> ID = str(uuid.uuid5(uuid.NAMESPACE_DNS, item['link']))
(Pdb) item['link']
u'http://dubai.dubizzle.com/property-for-rent/residential/apartmentflat/2014/4/6
/palm-jumeirah-abu-keibal-3-br-maid-partial-2/?back=ZHViYWkuZHViaXp6bGUuY29tL3By
b3BlcnR5LWZvci1yZW50L3Jlc2lkZW50aWFsL2FwYXJ0bWVudGZsYXQv&pos=1'
(Pdb)

正如您所见,item['link']是Unicode编码。

编辑1

当我将item['link']更改为任何其他属性,例如item['date'],代码就可以完美运行。


使用.decode('utf-8')将Unicode URL解码为字节,就可以正常工作了。 - Blender
@Blender 你是指 str(..).decode('utf-8') 还是 str(...item['link'].decode(utf-8)) - Marco Dinatsoli
第二个。您希望链接是一个字节字符串,而不是Unicode字符串。 - Blender
@Blender 仍然出现相同的错误。这是新代码 ID = str(uuid.uuid5(uuid.NAMESPACE_DNS, item['link'].decode('utf-8'))). - Marco Dinatsoli
糟糕,我的意思是使用.encode()而不是.decode() - Blender
@Blender 是的,可以。非常感谢。请键入答案以接受它。 - Marco Dinatsoli
1个回答

10

使用.encode('utf-8')将Unicode字符串编码为字节字符串,它应该可以正常工作:

str(uuid.uuid5(uuid.NAMESPACE_DNS, item['link'].encode('utf-8')))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接