只返回循环中的第一个结果

2024-10-03 13:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个循环(如下所示),它执行两次(索引1->;3),但是Scrapy在两个结果中只返回第一个trackname。但是print item行显示了str_selector的不同值,所以我知道循环正常,但是scray没有看到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

Tags: ingtfor错误itemsrangeitemselector
2条回答

你现在正在做的是创建一个item对象并在循环中更改它的值,你需要在循环中创建item。在

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

只是您应该为每个迭代构建一个新的项,而不是保持相同:您在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

现在,每次创建一个新对象:

^{pr2}$

对象现在不同了!在

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


1
2

相关问题 更多 >