通过scrapy报废数据的unicode问题

时间:2014-07-02 16:31:09

标签: python unicode scrapy decode encode

过去两周我很难处理一些我用scrapy报废的数据。我在windows7上使用python 2.7。这是通过scrapy xpath选择器报废和提取的一小段数据:

{'city': [u'Mangenberger Str.\xa0162', u'42655\xa0Solingen']}

这些数据是从utf-8编码的页面中删除的,至少就是它所说的:

Content-Type: text/html;charset=utf-8

所以我相信我需要解码它们才能得到:

Mangenberger Str. 16242655 Solingen

这是我在我的控制台中获得的内容:

>>> s='Mangenberger Str.\xc2\xa016242655\xc2\xa0Solingen'
>>> s1=s.decode('utf-8')
>>> print s1
Mangenberger Str. 16242655 Solingen

完美! 但这远远不是我运行脚本时收到的内容。我试着编码和解码:

uft-8 encoding
{'city': 'Mangenberger Str.\xc2\xa016242655\xc2\xa0Solingen'}
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 17:

utf-8-sig encoding
{'city': '\xef\xbb\xbfMangenberger Str.\xc2\xa016242655\xc2\xa0Solingen'}
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0:

utf-8 decoding
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in      position 17:

utf-8-sig decoding
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 17:

编码代码:

item['city']= "".join(element.select('//div[@id="bubble_2"]/div/text()').extract()).encode('utf-8')

解码代码:

item['city']= "".join(element.select('//div[@id="bubble_2"]/div/text()').extract()).decode('utf-8')

根据我的理解,当我尝试解码此字符串时,BOM字节是问题?但是,为什么它在我的控制台中没有问题就能正常工作,一旦我运行scrapy就无法工作(错误)?

1 个答案:

答案 0 :(得分:2)

该Python的unicode字符串中的

\xa0Non-breaking space character

u'Mangenberger Str.\xa0162'u'42655\xa0Solingen'是完全有效的unicode字符串。 Python非常适合使用unicode字符串。

Scrapy XPath选择器extract()调用获取unicode字符串列表。一直处理unicode通常是要走的路。

我不建议将scic代码中的unicode字符串编码为其他内容。 (以及它之后的编码,解码用于非unicode字符串以将它们转换为unicode字符串)

编码字符串的唯一步骤是在导出数据(CSV,XML)时,甚至已经处理完毕。

也许你可以用这些unicode字符串解释导致你麻烦的原因。