gpt4 book ai didi

python 和 scrapy 编码问题

转载 作者:太空狗 更新时间:2023-10-30 01:01:34 29 4
gpt4 key购买 nike

我简直想不通! :(我正在从一个 utf-8 编码的站点抓取数据,至少它是这么说的:

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

我正在使用 XPath 选择器 extract() 调用获取常规 unicode 字符串列表:

item['city']= element.select('//div[@id="bubble_2"]/div/text()').extract()

这是列表:

[u'Westbahnhofstr.\xa010', u'72070\xa0T\xfcbingen']

现在我将列表加入一个 unicode 字符串:

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

到目前为止还不错:

u'Beim Nonnenhaus\xa0672070\xa0T\xfcbingen'

当我尝试将此 unicode 字符串输出到屏幕(打印)或文件(写入)时出现问题。无论我尝试什么,它都会返回一个错误(http://pastebin.com/51DkX2R2):

exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in   position 11: ordinal not in range(128)

当然,我在输出之前已经将 unicode 编码为字节字符串:

item['city'].encode('utf-8')

这是我的 pipeline.py 以及我如何打开和写入我的 cvs:

import csv
import items
import urlparse
import codecs

class DepostPipeline(object):
def __init__(self):
self.modelsCsv = csv.writer(codecs.open('Dees.csv', mode='w',encoding='utf-8'))
self.modelsCsv.writerow(['city'])

def process_item(self, item, spider):
if isinstance(item, items.DetailsItem):
item['city'] = item['city'].encode('utf-8')

self.modelsCsv.writerow([item['city']])
return item

最奇怪的是我的系统(windows 上的 python)完美地处理了 unicode 字符串:

C:\Console2>python
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s=u'Beim Nonnenhaus\xa0672070\xa0T\xfcbingen'
>>> print s
Beim Nonnenhaus 672070 Tübingen

在过去的 10 天里,我一直在阅读有关 utf-8、unicode、编码和解码的大量内容,但似乎我仍然遗漏了什么?!感谢任何帮助或建议。

最佳答案

您忽略了 .encode() 调用的结果:

item['city'].encode('utf-8')

字符串是不可变的,并且不是就地编码的。更好的是,返回对象的类型 是不同的。您需要重新分配返回值:

item['city'] = item['city'].encode('utf-8')

但是,您不应该对 CSV 文件使用 codecs.open()csv 模块将始终写入字节串,而不是 Unicode。

通过使用 codecs.open() 文件对象,会发生隐式解码 以返回到 Unicode,就是那对你来说失败了;这就是为什么你得到一个 UnicodeDecodeError 异常,而不是编码错误:

  File "C:\Python27\lib\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 11: ordinal not in range(128)

改用常规的 open() 调用:

self.modelsCsv = csv.writer(open('Dees.csv', mode='wb'))

注意'wb'csv 模块自己处理行尾。

关于python 和 scrapy 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594160/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com