当我尝试打开一个可能缺少'http://'标题的网址时,我一直在另一个try-except
内使用try-except
。
但代码看起来很混乱。我想知道python是否有更好的方法来处理这些需求。实际上我已经阅读了'with'关键字..我觉得这会让代码更难以阅读......
我有打开的链接,但链接可能有些缺失。例如,网址就像。 xxx.com或http:/ / xxx。 COM。我必须测试 http://和url,http:// plus www。加上网址,网址 找到合适的人。
如果没有,我必须记录原因,然后继续下一个链接:
for link in links:
url = link
if not url.startswith('http'):
try:
url1 = r'http://'+link
res = requests.get(url)
except Exception as e:
try:
url2 = r'http://www.'+link
res = requests.get(url)
except Exception as err:
self.print_error(*[url1, modify(e.message)])
self.print_error(*[url2, modify(err.message)])
self.error_log(*[url1, modify(e.message)])
self.error_log(*[url2, modify(err.message)])
else:
try:
res = request.get(url)
except Exception as e:
self.print_error(*[url, modify(e.message)])
self.error_log(*[url, modify(e.message)])
答案 0 :(得分:7)
首先按优先顺序汇总潜在网址列表:
potential_urls = [link, 'http://' + link, 'http://www.' + link]
还要列出您遇到的错误列表:
errors_encountered = []
然后浏览列表,break
如果有效。
res = None
for url in potential_urls:
try:
res = requests.get(url)
except Exception as err:
errors_encountered.append(err)
else:
break
如果所有尝试均无效,我们会将res
设置为None
,我们可以根据需要检测并记录:
if res is None:
for url, err in zip(potential_urls, errors_encountered):
self.print_error(url, modify(err.message))
for url, err in zip(potential_urls, errors_encountered):
self.error_log(url, modify(err.message))
否则,它成功了,您可以像往常一样使用res
。
答案 1 :(得分:0)
这是另一种可能性,它通过在成功时继续循环来简化嵌套。
for link in links:
url = link
if not url.startswith('http'):
try:
url1 = r'http://'+link
res = requests.get(url)
continue # we succeeded
except Exception as e:
pass
try:
url2 = r'http://www.'+link
res = requests.get(url)
except Exception as err:
self.print_error(*[url1, modify(e.message)])
self.print_error(*[url2, modify(err.message)])
self.error_log(*[url1, modify(e.message)])
self.error_log(*[url2, modify(err.message)])
答案 2 :(得分:0)
与@ icktoofay的答案类似,但从视角开始,如果链接成功与否,您可能只需要工作。
定义一个执行可能尝试的函数,并返回一个请求对象,或在尝试所有可能性之后,引发一个异常。
def try_get(link):
for url in (link, 'http://' + link, 'http://www.' + link):
try:
return requests.get(url)
except Exception:
pass
raise ValueError('no url was suitable', link)
然后遍历您的网址,并使用res
或执行适合例外的操作。
for url in list_of_urls:
try:
res = try_get(url)
except ValueError as e:
print e