0

検索からブラックリストに登録されている URL を無視しようとしています。「ltp_block」には、異なる URL を含むデータが含まれています。

p = re.compile('href="(.*?)" rel="nofollow"')
url = "http://www.****.**" + p.findall(current)[0]

r = requests.get(url)

上記のコードは、「ltp_block」からさまざまな URL を取得するために使用されます。r.url は、呼び出されたときにループ内の URL を定義します。

for each_row in blacklist:
    if(re.findall('\\b'+each_row[0]+'\\b', r.url, flags=re.IGNORECASE) != []):
        print "found"

質問- 上記の「for」ループは 1 回しか機能しません。「check」が 1 になるか、メイン ループが別の URL を選択すると、この 2 番目の「for」ループは存在しないかのように単純にスキップされます。なんで ?

conn = sqlite3.connect('test.db')
c = conn.cursor()
blacklist = c.execute("SELECT `name` FROM `blacklist`")
check = 0
for row in ltp_block:

        p = re.compile('versan')
        current = ltp_block[check]
        if(p.findall(current) != []):
            p = re.compile('price=(.*?)&')
            ltp = p.findall(current)[0]
            del p
        else:
            p = re.compile('Gesa: (.*?) &')
            ltp = p.findall(current)[0]
            del p

        p = re.compile('href="(.*?)" rel="nofollow"')
        url = "http://www.****.**" + p.findall(current)[0]

        r = requests.get(url)

        for each_row in blacklist:
            if(re.findall('\\b'+each_row[0]+'\\b', r.url, flags=re.IGNORECASE) != []):
                print "found"

        check = check + 1

答え -

毎回 blacklist = c.execute("SELECT nameFROM blacklist") を再コンパイルする必要がありました

メインの「for」ループに配置しましたが、すべてが機能しています

4

2 に答える 2

3

c.executeイテレータを返しています。イテレータは 1 回だけ反復できます。より簡単な例として、これを試してください:

numbers = (x for x in xrange(10))  # a simple iterator

for number in numbers:
     print number

print "Repeat"

for number in numbers:
     print number

2 番目のループの開始時に反復子が使い果たされて空であるため、最初のループのみが出力を返します。それを次のものと比較してください。

numbers = (x for x in xrange(10))
numbers = list(numbers)  # turn the iterator into a list

for number in numbers:
     print number

print "Repeat"

for number in numbers:
     print number

これは期待どおりに機能します。あなたの場合、あなたは欲しい:

blacklist = list(c.execute("SELECT `name` FROM `blacklist`"))
于 2012-11-25T15:29:34.150 に答える
1

forループを「存在しないように単にスキップする」ための唯一の方法は、繰り返すものがない場合です。それが本当なら、唯一の説明はそれblacklistが空であるということです。あなたが報告したことが真実であるならば、他の説明は単にありません。

そのようなことは非常に簡単に証明できます。ループの直前にprintステートメントを追加し、次の値を出力しますblacklist

print "blacklist:", blacklist
for each_row in blacklist:
    ...
于 2012-11-25T14:06:55.147 に答える