0

私は Scrapy を使用してサイトをクロールし、3 つの要素から CSV を作成しています。Scrapy サイト パイプラインの例に合わせて、「id」、「name」、および「desc」とします。これらのアイテムをスクレイピングして csv に出力しています。同じ 'id' 文字列を持つ ROWS は必要ありません。

これは Scrapy のパイプラインの例です:

class DuplicatesPipeline(object):

    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['id'])
            return item

しかし、そのコードを使用すると、exceptions.TypeError: unhashable type:'list'

ただし、タプルに変換しようとすると、次のようになります。

def process_item(self, item, spider):
    if tuple(item.get('id', '')) in self.ids_seen:
        raise DropItem("Duplicate item found: %s" % item)
    else:
        self.ids_seen.add(item.get['id'])
        return item

私は得るexceptions.TypeError: 'instancemethod' object has no attribute '__getitem__'

アイテム パイプラインを使用して、「id」列に同じ「id」文字列を持つ複数の行を単純に許可しない方法を教えてください。セルに空白のスポットを入れたくない場合でも、単一の要素を拒否するのは間違っているかもしれません-「id」アイテムを共有する場合、行全体をスキップしたいのです。csvexporter や csv スパイダーなどで何かが必要な場合は、これにパイプラインを使用することもできません。これは Scrapy を使えば簡単にできるようです。


解決?

最初のコードをこれに変更して文字列を作成することで解決したと思います:

def process_item(self, item, spider):
        idstring = str(item['id'])
        if idstring in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(idstring)
            return item

私は完全なPython初心者なので、これが問題のある解決策であるかどうかを教えてください:)

4

1 に答える 1

0

ええと、セットの代わりにリストを使用するようにパイプラインを変更できると思います。

変更してみてください:

class DuplicatesPipeline(object):

    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['id'])
            return item

の中へ:

class DuplicatesPipeline(object):

def __init__(self):
    self.ids_seen = []

def process_item(self, item, spider):
    if item['id'] in self.ids_seen:
        raise DropItem("Duplicate item found: %s" % item)
    else:
        self.ids_seen.append(item['id'])
        return item

乾杯

于 2014-11-17T11:49:10.733 に答える