我有一个循环(如下所示)执行两次(索引1-> 3),但Scrapy只返回两个结果中的第一个trackname。但是print item
行显示str_selector
的不同值,所以我知道循环有效,但Scrapy没有看到x
的变化值。
知道我犯了什么错误吗?
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
答案 0 :(得分:4)
只是你应该为每次迭代构建一个新项目,而不是保持相同:你在items
中添加相同的对象,即mutable(对于所有用户定义的类,默认在python中)所以当你更新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
答案 1 :(得分: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