0

次のように、メタプロパティを介してスクレイプアイテムをコールバック関数に渡します。

def parse_VendorDetails(self, response):
    loader = XPathItemLoader(response.meta['item'], response=response)

    print loader.get_collected_values('testField') <-- returns empty value
    print response.meta['item']['testField'] <-- return expected value

最初の印刷は空のリストを出力します。2番目の印刷では、期待どおりの値が返されます。これの理由は何でしょうか?

4

1 に答える 1

1

現在、ItemLoadersバグがあり、パラメータをget_output_value()無視get_collected_values()して確認するだけなので、これらのメソッドには、ロードされたデータが返されないという一貫性のない動作があります。itemItemLoader._valuesload_item()

>>> from scrapy.contrib.loader import ItemLoader
>>> il = ItemLoader(response=response, item=dict(foo=1))
>>> il.add_value('bar', 3)
>>> il._values
defaultdict(<type 'list'>, {'bar': [3]})

>>> il.item
{'foo': 1}

>>> il.get_output_value('foo')
[]

>>> il.get_output_value('bar')
[3]

>>> il.get_collected_values('foo')
[]

>>> il.get_collected_values('bar')
[3]

提案されたパッチをインストールすることも、使用しないこともできますget_collected_values。パッチをインストールするvaluesと、このパッチでパラメータを使用でき、より適切な結果が得られます。

>>> from scrapy.contrib.loader import ItemLoader
>>> il = ItemLoader(response=response, item={}, values=dict(foo=1))
>>> il.add_value('bar', 3)
>>> il._values
defaultdict(<type 'list'>, {'foo': [1], 'bar': [3]})

>>> il.item
{}

>>> il.get_output_value('foo')
[1]

>>> il.get_output_value('bar')
[3]

>>> il.get_collected_values('foo')
[1]

>>> il.get_collected_values('bar')
[3]
于 2013-03-17T22:42:00.247 に答える