私は 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初心者なので、これが問題のある解決策であるかどうかを教えてください:)