python缩短嵌入式try-except块

jil*_*xie 2 python try-except python-requests

当我尝试打开一个可能有也可能没有'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)])
Run Code Online (Sandbox Code Playgroud)

ick*_*fay 7

首先按优先级顺序组合潜在URL列表:

potential_urls = [link, 'http://' + link, 'http://www.' + link]
Run Code Online (Sandbox Code Playgroud)

还要记下您遇到的错误列表:

errors_encountered = []
Run Code Online (Sandbox Code Playgroud)

然后浏览列表,break如果它有效.

res = None
for url in potential_urls:
    try:
        res = requests.get(url)
    except Exception as err:
        errors_encountered.append(err)
    else:
        break
Run Code Online (Sandbox Code Playgroud)

如果没有任何尝试有效,我们将把resset设置为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))
Run Code Online (Sandbox Code Playgroud)

否则,它成功了,你可以res照常使用.