2012-09-03 117 views
1

我有一個循環(如下圖所示)執行兩次(索引1-> 3),但Scrapy只返回兩個結果中的第一個曲目名。但print item線顯示str_selector不同的值,所以我知道循環的作品,但Scrapy沒有看到x的變化值。Scrapy只返回循環中的第一個結果

任何想法我犯了什麼錯誤?

items = [] 
item = scrapyItem() 

for x in range (1,3): 
    str_selector = '//tr[@name="tracks-grid-browse_track_{0}"]/td[contains(@class,"secondColumn")]/a/text()'.format(x) 
    item['trackname'] = hxs.select(str_selector).extract() 
    print item 
    items.append(item) 
return items 

回答

4

只是,你應該建立一個新的項目每次迭代,而不是保持相同的:你在items(默認情況下,蟒蛇爲所有用戶定義的類)添加相同的對象,這是mutable所以當你更新item['trackname']時,所有包含的項目都會更新!

下面是一些代碼來說明:

>>> class C(object): 
     # Basic user-defined class 
    def __init__(self): 
     self.test = None 


>>> c = C() 
>>> items = [] 
>>> for x in range (1,3): 
    c.test = x 
    print c, c.test 
    items.append(c) 


<__main__.C object at 0x01CEB130> 1 
<__main__.C object at 0x01CEB130> 2 
>>> items # All objects contained are the same !!! 
[<__main__.C object at 0x01CEB130>, <__main__.C object at 0x01CEB130>] 
>>> for c in items: 
    print c.test 


2 
2 

現在創建一個新的對象,每次:

>>> items = [] 
>>> for x in range (1,3): 
    c = C() 
    c.test = x 
    print c, c.test 
    items.append(c) 


<__main__.C object at 0x01CEB110> 1 
<__main__.C object at 0x011F2270> 2 

對象是現在不同了!

>>> for c in items: 
    print c.test 


1 
2 
+0

非常感謝Emmanuel。作品一種享受。我猜想我每次循環都會改變它的值。 Noob錯誤:) – zoonosis

1

究竟是什麼,你正在做的,現在正在創建一個項目對象,並在循環改變它的價值,你需要在循環創建項目。

items = [] 
#item = scrapyItem() 

for x in range (1,3): 
    item = scrapyItem() 
    str_selector = '//tr[@name="tracks-grid-browse_track_{0}"]/td[contains(@class,"secondColumn")]/a/text()'.format(x) 
    item['trackname'] = hxs.select(str_selector).extract() 
    print item 
    items.append(item) 
return items 
+0

感謝您的幫助。非常感激。 – zoonosis