我通过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
第一个打印输出一个空列表。第二个打印按预期返回值。 这可能是什么原因?
答案 0 :(得分:1)
目前有一个bug in ItemLoaders,get_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]