2014-10-22 61 views
0

我一個在scrapy有一個問題關於保存列表項一個scrapy只能保存一個項目

我的代碼是這樣的:

class MySpider(Spider): 
    name = "test" 
    start_urls=[""] 
    def parse(self, response): 
     sel = Selector(response) 
     sites = sel.xpath("//a[contains(@href, '.html')]") #many .html 
     for i,site in enumerate(sites): 
      item = YoutoItem()    
      item['link'] = site.xpath("./@href").extract()[0] 
      item['title'] = site.xpath("./text()").extract()[0] 
      yield Request(url=link,meta={'item':item}, callback=self.parse_ler) 
      break #just test the first one.html 

    def parse_ler(self, response): 
     item = response.meta['item'] 
     sel = Selector(response) 
     url = sel.xpath("//embed/@src").extract() 
     for t in url: 
      print t #it will print url1,url2,url3 
      item['url'] = t 
      yield item 

而且我pipline.py

class YoutoPipeline(object): 
    def process_item(self, item, spider): 
     item.save() 
     return item 

終端將打印輸出:

{'link': u'http://test.html', 
'title': u'A', 
'url': u'url1'} 
{'link': u'http://test.html', 
'title': u'A', 
'url': u'url2'} 
{'link': u'http://test.html', 
'title': u'A', 
'url': u'url3'} 

但當它保存到數據庫中,它會ONY救了他們的一個

{'link': u'http://test.html', 
'title': u'A', 
'url': u'url1'} 

我thinl這是因爲項目[「網址」]被for循環

獲取請教我如何編輯保存這些3 DATAS seperately到數據庫
我的數據庫PostgreSQL的是

編輯

我發現了一個方法: 只是把項目= YoutoItem()的for循環下
,它可以工作:

for t in url: 
    item = YoutoItem()  
    item['url'] = t 
    yield item 
+0

parse_ler如何被調用?你在這個函數中產生的字典項目是怎麼做的? – greole 2014-10-22 07:31:16

+0

標題A是一個活動,它有3部電影(url1,url2,url3),我想將它保存到數據庫。 – user2492364 2014-10-22 07:35:31

+0

@ user2492364向我們展示有關調用函數parse_ler將數據插入數據庫的代碼,以便我們知道爲什麼只保存第一個數據。 – 2014-10-22 07:55:03

回答

0

如果您需要單獨存儲在數據庫中的項目,只需使用另一個YoutoItem()

yield Request(url=link,meta={'item':item}, callback=self.parse_ler) 

可以被改寫爲:

# def parse 
# or Request if you import scrapy.Request, and you don't need request.meta 
yield scrapy.Request(link, callback=self.parse_ler) 

# def parse_ler, which you don't need the request.meta anymore 
sel = Selector(response) 
url = sel.xpath("//embed/@src").extract() 
for t in url: 
    item = YoutiItem() # just construct a new YoutoItem 
    item['url'] = t 
    yield item 
+0

謝謝,但我需要單獨保存它。並且我找到了一個方法。但是,謝謝,下次我可以使用這個技巧! – user2492364 2014-10-22 08:50:43

+0

@ user2492364,好吧,不知道你需要單獨使用它們,是的,只需使用parse2上的另一個scrapy項目就行了,祝你好運:) – Anzel 2014-10-22 08:54:58

+0

回答編輯,因爲你需要 – Anzel 2014-10-22 09:03:05