如何在Scrapy中正确使用item_loader? Item_loader类无法正常工作

时间:2013-03-17 13:10:51

标签: scrapy

我通过meta属性将scrapy项目传递给回调函数,如下所示:

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

第一个打印输出一个空列表。第二个打印按预期返回值。 这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

目前有一个bug in ItemLoadersget_output_value()get_collected_values()忽略item参数,只看ItemLoader._values所以这些方法中存在一些不一致的行为通过load_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]

您可以安装the proposed patch或不使用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]