1

itemLoader を使用して、Scrapy の空のアイテムにデフォルト値を与えようとしています。items.py のように:

prod_specs = Field(
    default=[],
    input_processor=MapCompose(unicode_to_str, strip_tabs_new_lines),
)

したがって、prod_specs が設定されていない場合は、空のオブジェクトを指定する必要があります。しかし、それは機能していません。フィールドをデータベースに保存しようとするとitem['prod_specs'].

キーが存在しないというエラーが表示されます。

exceptions.KeyError: 'prod_specs' 

設定されていない場合は、他のフィールドも同様です。item['prod_specs']items.pyのようにitemLoaderではなく、使用しているという事実がエラーを引き起こしていると思います。確信はないけど。

それで、あなたたちはどう思いますか?そして、これに対する解決策はありますか?

4

1 に答える 1

1

編集: 公式ドキュメントは古くなっているようで、フィールドのデフォルト値はもう機能しません ( https://github.com/scrapy/scrapy/issues/560を参照)。別のオプションは、パイプラインを使用してデフォルト値を項目に割り当てることです。

def parse_item(self, item, spider):
    if "prod_specs" not in item: item['prod_specs'] = []
    return item

またはpsycopg2挿入中:

def parse_item(self, item, spider):
    cur.execute("insert into mytable(prod_specs) values(%s)",
                item.get('prod_specs',[]))
    return

ItemLoader をアイテムとして使用しようとしています。アイテムとアイテムローダーをセットアップする方法は次のとおりです。

アイテム.py

from scrapy.item import Field, Item
from scrapy.contrib.loader.processor import MapCompose

class Product(Item):
    prod_specs = Field(
        default=[],
        input_processor=MapCompose(unicode_to_str, strip_tabs_new_lines)
    )

スパイダー/myspider.py

from scrapy.contrib.loader import ItemLoader
from myproject.items import Product

def parse(self, response):
    l = MyLoader(item=Product(), response=response)
    l.add_xpath('prod_specs', '//div[@class="prod_specs"]')
    return l.load_item()

多くの異なるアイテムを使用する場合は、ItemLoader をサブクラス化し、デフォルト プロセッサを定義する必要があります。

あなたの質問に答えるにはそれで十分ですか?Postgres パイプラインを書きたいとおっしゃいました。私が最も簡単だと思ったのは、SQLAlchemy を使用することです。この方法では、単一のパイプラインで、必要な数のデータベースに多くのオブジェクトを書き込むことができます。

于 2014-07-12T16:54:56.173 に答える