2

当我尝试打开一个可能缺少“http://”标头的 url 时,我一直try-except在另一个内部使用。try-except

但是代码看起来很乱。我想知道python是否有更好的方法来处理这些需求。实际上我已经阅读了'with'关键字。我觉得这会使代码更难阅读......

我有要打开的链接,但链接可能缺少某些内容。例如,网址是这样的。xxx.com 或 http://xxx. com。我必须测试 http:// 和 url,http:// 加上 www。加url,找到合适的url。

如果没有工作,我必须记录原因,然后继续下一个链接:

    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)])
4

3 回答 3

7

首先按优先级排列一个潜在 URL 列表:

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照常使用。

于 2014-08-15T05:38:27.410 回答
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)])
于 2014-08-15T05:46:20.473 回答
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
于 2014-08-15T05:47:39.143 回答