1

2回実行されるループ(以下に示す)があります(インデックス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 に答える