@bugagashnik

Почему выдает ошибку при использовании find()?

Исходный код:
# -*- coding: utf-8 -*-

import pymongo as pymongo
from dictionary import dictionary
class DiplomaPipeline(object):
    collection_name = 'DiplomaItem'
    arr = ['да', 'нет']

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        ## initializing spider
        ## opening db connection
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        ## clean up when spider is closed
        self.client.close()

    def process_item(self, item, spider):
        ## how to handle each post
        print('~~~~~~~~~~!!!!', )
        for word in self.arr:
            print(word)
            print(item['Comment'])
           print(item['Comment'].find(word))
        # self.db[self.collection_name].insert(dict(item))
        # logging.debug("Post added to MongoDB")
        return item


Лог ошибок:
да
Вообще это не смешно, а практично, заменить двух мальеньких нигеров на два вместительных бака.
2018-04-06 15:27:06 [scrapy.core.scraper] ERROR: Error processing {'Comment': u'\u0412\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e \u043d\u0435 \u0441\u043c\u0435\u0448\u043d\u043e, \u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0432\u0443\u0445 \u043c\u0430\u043b\u044c\u0435\u043d\u044c\u043a\u0438\u0445 \u043d\u0438\u0433\u0435\u0440\u043e\u0432 \u043d\u0430 \u0434\u0432\u0430 \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0430\u043a\u0430.',
 'MainPageUrl': u'https://pikabu.ru/story/bezyiskhodnost_5826272'}
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Users/mymac/Work/crawler/diploma/diploma/pipelines.py", line 36, in process_item
    print(item['Comment'].find(word))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)


По вопросу:
Ошибка в методе process_item.
Я в питоне нулина, к сожалению. Мой кроулер собирает комментарии, мне нужно профильтровать каждый коммент. Пока что тестово написал сравнение по массиву, с применением функции find(). Выдает ошибку. Подозреваю, что что-то не так с кодировкой, однако не могу понять как исправить, ибо если в массиве латинские слова, то все ок.
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
@bugagashnik Автор вопроса
Как обычно это бывает, такие ошибки происходят из-за плохого понимания языка. Суть в том, что я пытался сравнить данные двух разных типов: string и unicode string. Как только понял это, остается выяснить как конвертнуть из unicode string в string. Сделал следующее: item['Comment'].encode('utf-8')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
Похожую ошибку разбирали вот тут:
https://stackoverflow.com/questions/21129020/how-t...

Как решение предложили установить кодировку по умолчанию:
import sys

reload(sys)
sys.setdefaultencoding('utf8')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы