1

我有一个执行两次(索引 1->3)的循环(如下所示),但 Scrapy 只返回两个结果中的第一个轨道名称。但是该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
4

2 回答 2

4

只是您应该为每次迭代构建一个新项目,而不是保持不变:您添加items相同的对象,该对象是可变的(对于 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
于 2012-09-03T13:20:37.067 回答
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
于 2012-09-03T13:52:19.753 回答