2012-02-01 89 views
0

試圖使用CSVFeedSpider從CSV文件中抓取一些行 該文件的結構是下一個: ID |類別|價格 我需要抓取其中只有一個spefic類行「支付」 接下來我要做的:Scrapy CSV爬行

class Outillage_spider(CSVFeedSpider): 
name = 'domain.com' 
allowed_domains = ['domain.com', 'www.domain.com'] 
start_urls = ('http://www.domain.com/file.csv',) 

delimiter = ';' 
headers = ['name', 'category', 'price'] 

def parse_row(self, response, row): 
    categories = ['Bosch','Dolmar','Fein','Hitachi','Karcher','Leman','Makita','SDMO','Ski'] 
if row['category'] in categories: 
     res = {} 
     res['name'] = row['name'] 
     res['price'] = row['price'] 
     return load_product(res, response) 
    else: 
    return None 

而接下來我得到了:

 File "/home/rolikoff/web/scrapy_projects/local/lib/python2.7/site-packages/Scrapy-0.14.1-py2.7.egg/scrapy/contrib/spiders/feed.py", line 129, in parse_rows 
    raise TypeError('You cannot return an "%s" object from a spider' % type(ret).__name__) 
exceptions.TypeError: You cannot return an "NoneType" object from a spider 

我認爲它發生在parse_row( )返回無。但我不知道如何改變這個功能。你有什麼想法?

感謝 梅德

回答

1

嘗試返回空listtuple代替None

else: 
    return [] 

並確保,即load_product回報listtupleItemRequest

1

據我所關注的,你必須得到parse_row內場!例如,這是我爲抓取Podcast網址所做的一個蜘蛛: https://github.com/arthurnn/podcast/blob/master/podcast/spiders/itunes_spider.py

我會刪除其他的!試試這個:

if row['category'] in categories: 
     res = {} 
     res['name'] = row['name'] 
     res['price'] = row['price'] 
     yield load_product(res, response) 

但是,如果你不使用正常的蜘蛛!對於CSVFeedSpider閱讀我的編輯波紋管:

編輯

在這種情況下,你必須返回一個BaseItem,列表或元組!如果你看看CSVFeedSpider http://dev.scrapy.org/browser/scrapy/contrib/spiders/feed.py?rev=1516的實現!你會看到,

+0

它不允許使用yueld \t文件「/home/rolikoff/web/scrapy_projects/local/lib/python2.7/site-packages/Scrapy-0.14.1-py2.7.egg/scrapy/contrib/spiders/feed.py」,第129行,在parse_rows \t引發TypeError('你不能從蜘蛛'%type(ret).__ name__返回一個「%s」對象) \t exceptions.TypeError:你不能從蜘蛛中返回一個「生成器」對象 – KennyPowers 2012-02-01 15:40:52

+0

明白了!抱歉!閱讀我的編輯! – 2012-02-01 15:46:08

+1

好吧,我已經找到了解決方案 更換 回報無 與 ()返回 還是要謝謝你! – KennyPowers 2012-02-01 15:46:47