2012-11-25 28 views
0

我試圖忽略從我的搜索列入黑名單的網址。 'ltp_block'包含包含不同url的數據。for循環第一次後不遍歷 - Python

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

r = requests.get(url) 

上面的代碼是用於獲取從「ltp_block」不同的網址。 r.url在調用時定義循環中的url。

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

問題 - 上面的 'for' 循環的工作一次。當'check'變成1或者主循環選擇另一個url時,這個'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 

答案 -

我不得不重新編譯黑名單= c.execute( 「SELECT name FROM blacklist」)每次

我把它放在主 'for' 循環和一切工作現在

+1

你究竟是什麼意思的「不正當行爲」?它沒有運行嗎?它會拋出一個錯誤嗎?您是否嘗試過最簡單的調試技術:打印中間值以查看它們是否符合您的期望? –

+0

它被跳過,因爲它不存在。編輯 – Nuv

+1

請注意,在Python中循環計數是糟糕的風格,請使用「enumerate()」代替。 –

回答

1

for循環被「簡單地忽略,就像它不存在」的唯一方法是,如果沒有什麼可以迭代。如果確實如此,唯一的解釋是blacklist是空的。如果你的報告是真實的,那麼沒有其他解釋。

這樣的事情很容易證明。立即循環之前添加打印語句,並打印出的blacklist值:

print "blacklist:", blacklist 
for each_row in blacklist: 
    ... 
+0

不黑名單永遠不會是空的。我也調試過它。 – Nuv

+0

如果'blacklist'不爲空,那麼斷言循環未運行就是錯誤的。循環正在運行,但循環內的代碼沒有達到你所期望的。如果'黑名單'是可迭代且非空的,則循環將運行。 –

+0

是的你是對的。我找到了答案,我在主循環及其工作中放置了黑名單= c.execute(「SELECT'name' from'blacklist'」)。然而,這讓我好奇,即時通訊沒有將黑名單分配給其他任何東西,那麼爲什麼我必須將它放在主for'循環中才能正常工作 – Nuv

3

c.execute將返回一個迭代器。迭代器只能迭代一次。作爲一個簡單的例子,試試這個:

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

for number in numbers: 
    print number 

print "Repeat" 

for number in numbers: 
    print number 

只有第一回路提供任何輸出,迭代器耗盡,空在第二的開始。將其與:

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`"))