【问题标题】:unicode issue with scraped data via scrapy通过scrapy刮取数据的unicode问题
【发布时间】:2014-07-02 16:31:08
【问题描述】:

过去两周我很难处理一些我用 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就不能工作(错误)?

【问题讨论】:

    标签: python unicode scrapy decode encode


    【解决方案1】:

    \xa0 在那个 Python unicode 字符串是 Non-breaking space character

    u'Mangenberger Str.\xa0162'u'42655\xa0Solingen' 是完全有效的 unicode 字符串。 Python 可以很好地处理 unicode 字符串。

    Scrapy XPath 选择器extract() 调用为您提供 unicode 字符串列表。并且一直处理 unicode 通常是要走的路。

    我不建议将 unicode 字符串编码为您的 scrapy 代码中的其他内容。 (它是你所追求的编码,解码是针对非 unicode 字符串将它们转换为 unicode 字符串)

    对字符串进行编码唯一有意义的步骤是在最后,当导出数据(CSV、XML)时,甚至已经处理了。

    也许您可以解释一下这些 un​​icode 字符串导致您遇到问题的原因。

    【讨论】:

    • 感谢您的输入,您是对的,我仔细查看了错误,当scrapy 尝试导出到 csv 文件时,它似乎发生了。这就是我打开文件写入的方式:self.modelsCsv = csv.writer(codecs.open('my.csv', mode='wb',encoding='utf-8')) 这就是我尝试写入我的 csv 文件的方式:self.modelsCsv.writerow([item['city']]) 所以我想我在这里做错了什么?
    • 你知道如何解决这个问题吗?
    • 你在写你的自定义item exporter吗? Scrapy 内置了对 CSV 输出的支持。但是如果你想定制它,你可以继承CsvItemExporter。并阅读 Python 的 csv 对 Unicode 输入的评价(该输入最好已经是 UTF-8)
    • 问题已解决:link 感谢回复!
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2022-11-01
    • 2021-07-05
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多