2010-07-07 54 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'