2013-03-17 38 views
0

我通過元屬性傳遞scrapy項目的回調函數,像這樣:如何正確使用Scrapy中的item_loader? Item_loader類工作不正常

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

目前尚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] 
+0

非常棒!謝謝! – Jabb 2013-03-19 18:22:30