我的代码如下:
import mechanize
import urlparse
import util
url = "https://math.berkeley.edu/~strain/"
urls = [url]
visited = []
link_pdf = []
br = mechanize.Browser()
br.open(url)
while len(urls) > 0:
try:
br.open(urls[0])
urls.pop(0)
for link in br.links():
new_url = urlparse.urljoin(link.base_url, link.url)
print new_url
urls.append(new_url)
except:
print "error"
以下是它的运行方式: 在某些方面,它将是这样的:
https://math.berkeley.edu/~strain/Publications/tvm.pdf
error
https://math.berkeley.edu/~strain/Publications/vce.pdf
error
https://math.berkeley.edu/~strain/Publications/mclaughlin.strain.kdv.pdf
error
error
error
error
error
error
....
我只想打印四次
它将运行并打印“错误”,直到某些点只会永远打印出错误。并且,我只希望它只打了四次我的脚本命中错误并打破它。 因此,任何人都可以告诉我该怎么做?谢谢。
编辑:我发布了永远导致错误的代码及其运行方式。答案 0 :(得分:0)
如果我正确理解您的问题,您只想允许错误四次。
计算您遇到的错误数量,并在达到限制时让循环结束。
errors = 0
while len(urls) > 0 and errors < 4:
try:
#doing something
except:
errors += 1
print "error"
答案 1 :(得分:0)
我最好的猜测是在“try:”语句中你做了一些改变url变量长度的东西。当“try:”无法运行时,len(url)在循环的其余部分保持不变(假设你的意思是“while”而不是“why”)和“except:”是唯一仍在执行的部分。
在不知道其余代码的情况下,我无法提供太多帮助
编辑:您编辑了帖子,看起来我是正确的,当“尝试:”部分失败时,新网址永远不会分配新的网址,而进入无限循环时,它会永远打印“错误”。
答案 2 :(得分:0)
你可以像这样使用嵌套while循环的计数器:
while you_cond:
tries = 0
while tries < 4:
try:
pass # do something
break
except Exception:
print('error')
tries += 1
此外,您可以在主while循环中使用这两个条件并省略第二个条件(在这种情况下行为会发生变化)。
答案 3 :(得分:0)
关于代码的问题是关于不变量,即:
len(urls) > 0
代码的try
部分可能会稍微改变urls容器的长度。
如果您不希望在第一次失败后达到无限循环,则必须更改except
部分上的容器,最好删除导致错误的项目。
我简短的说法:就目前而言,len(urls)
在第一次错误后永远不会改变。
然后,作为Python程序员,您应该知道最好捕获您可能期望的特定异常,并让其他异常通过,因为通过的异常将指向错误(错误在你的解决方案中)。