0
urllist = ['http://example.com',
           'http://example1.com']
i = 0
while i < len(urllist):
    source = urllib.urlopen(urllist[i]).read()
    regex = '(\d{3})/">(\w+\s-\s\w+)</a>'  # e.g. '435', 'Tom-Jerry' 
    p = re.compile(regex)
    db = re.findall(p, source)
    db = [tuple(filter(None, t)) for t in db]   

    hero_id = []
    for i in db:
        hero_id.append(i[0])

    i += 1
print hero_id

db = [tuple(filter(None, t)) for t in db] dbこのようなタプルのリストです:[('564', 'Tom', 'Jerry'), ('321', 'X-man', 'Hulk')]

この背後にあるロジックは次のとおりです。から始めてurllist[0]、正規表現を検索し、dbのすべてのタプルについてを収集し、タプル(番号)から要素を取得してリストに追加しdbます。完了したら、1を追加し、残りがない状態で次のURLに対してプロセス全体を繰り返します。[0]hero_idiurllist

このコードを実行すると、次のようになります。

i += 1 TypeError: can only concatenate tuple (not "int") to tuple

i += 1コード内はforループの外側にあるため、この例外は私を少し驚かせます。アイデア?

4

2 に答える 2

2

「foriindb」ループは、タプルをiに割り当てます。iのスコープは関数(または、モジュールスコープコードの場合はモジュール)です。

独自のスコープを持つPython2の唯一のループ構文は、ジェネレーター式です。

于 2013-03-09T20:34:34.847 に答える
2

forループは、ループ内for i in db:の値を変更しています。forループで別の(よりわかりやすい)名前を使用します。iwhile

于 2013-03-09T20:36:27.187 に答える