过去两周我很难处理一些我用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就无法工作(错误)?
答案 0 :(得分:2)
\xa0
是Non-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字符串解释导致你麻烦的原因。