2010-07-07 52 views
4

我正在嘗試這個簡單的代碼,但該死的休息不起作用...什麼是錯的?如何擺脫一段時間的嘗試/除了一段時間? [Python]

while True: 
    for proxy in proxylist: 
     try: 
      h = urllib.urlopen(website, proxies = {'http': proxy}).readlines() 
      print 'worked %s' % proxy 
      break 
     except: 
      print 'error %s' % proxy 
print 'done' 

它應該離開,而當連接工作,回去試試其他代理,如果它沒有

好吧,這裏是我在做什麼

我試圖檢查一個網站,如果它改變了,它必須跳出來繼續到腳本的其餘部分,但是當代理不連接時,我從變量中得到錯誤,因爲它是空的,所以我希望這是爲了工作作爲循環來嘗試一個代理,如果它工作,繼續腳本,腳本的結束,回去嘗試下一個代理,如果下一個不工作,它會回到該開始嘗試第三代理,等等....

我想這樣

while True: 
    for proxy in proxylist: 
     try: 
      h = urllib.urlopen(website, proxies = {'http': proxy}) 
     except: 
      print 'error' 
     check_content = h.readlines() 
     h.close() 
     if check_before != '' and check_before != check_content: 
      break 
     check_before = check_content 
     print 'everything the same' 
print 'changed' 
+1

你知道'break'也打破了for循環。所以你的'break'不會從while循環中跳出來,它會跳出直接循環。 – jcao219 2010-07-07 21:42:51

+1

你絕對不應該使用裸體'excepts'!抓住一個特定的錯誤總是更好! – jathanism 2010-07-07 21:50:19

回答

10
東西

你只是打破for循環 - 沒有while循環:

running = True 
while running: 
    for proxy in proxylist: 
     try: 
      h = urllib.urlopen(website, proxies = {'http': proxy}).readlines() 
      print 'worked %s' % proxy 
      running = False 
     except: 
      print 'error %s' % proxy 
print 'done' 
+8

如果設置運行爲False,如果繼續通過代理砍斷沒有意義,您可能還想保持中斷。 – mrooney 2010-07-07 21:43:03

+1

我看不出有什麼理由 - 我只是把它留在我的代碼示例中,因爲我認爲它是作者實際嘗試實現的簡化版本。最簡單的解決方案就是刪除while循環。 – petraszd 2010-07-07 21:47:29

+0

while循環讓腳本再次嘗試相同的代理,希望可能其中一個現在開始工作。代替while循環,你可以在itertools.cycle(proxylist)中使用代理,然後一個簡單的'break'就足夠了,不需要額外的控制變量。 – 2010-07-10 13:54:49

3

您只能跳出for循環,因此您絕不會離開while循環並重復重複遍歷proxylist。只是省略了周圍的while循環,其實我不明白爲什麼你把代碼放在while True的第一位。

1

break打破了最內層的循環,這就是你的情況下的for循環。爲了從多個迴路斷線,你有幾種選擇:

  1. 介紹一個條件
  2. 創建一個子和使用return

但在你的情況其實並不需要外while循環在所有。只要刪除它。

1

您可以使用自定義異常,然後抓住它:

exit_condition = False 

try: 

    <some code ...> 

    if exit_conditon is True: 
     raise UnboundLocalError('My exit condition was met. Leaving try block') 

    <some code ...> 

except UnboundLocalError, e: 
    print 'Here I got out of try with message %s' % e.message 
    pass 

except Exception, e: 
    print 'Here is my initial exception' 

finally: 
    print 'Here I do finally only if I want to'