Python-从错误消息请求完整URL

时间:2014-07-07 20:21:42

标签: python python-requests

我试图通过请求库取消删除URL。我现在正在做这样的事情:

import requests
from contextlib import closing

def unshorten(url):
    session = requests.session()
    with closing(session.head(url)) as req:
        r = req
    if not r.headers.get('location'):  # not a redirect
        return url
    tmp_url = url
    try:
        for redir in session.resolve_redirects(r, r.request):
            if redir.status_code == 200 and not url_no_good(redir.url):  # ok!
                return redir.url
            else:
                tmp_url = redir.url
        else: # no acceptable responses :(
            return tmp_url
    except requests.exceptions.TooManyRedirects:
        return url

(url_no_good是一些测试的简写,以确保网址不是,例如,DNS介导的404页面)

我遇到了一个问题,即某个网址会重定向到一个不再有效的网站。我不想要缩短的链接,我想要的是“不好的”。网址。我解决了#39;这个用

ERR_PAT = re.compile(r'host=\'([\w\d\.]+)\'')
...
        try:
            for redir in session.resolve_redirects(r, r.request):
            ...
        except requests.exceptions.TooManyRedirects:
            return url
        except requests.exceptions.ConnectionError as e:
            return 'http://' + re.search(ERR_PAT, e.message.message).group(1) + e.message.url

因为,对于请求ConnectionError,err.message.message是错误的字符串表示,err.message.url是网址的非域部分,例如/foo/bar?baz=bloo。将错误消息的不同部分拼凑在一起感觉令人难以置信的 hacky,我真的很好奇是否有一种不那么复杂的方式来处理这种事情。

1 个答案:

答案 0 :(得分:0)

当引发该异常时,redir仍然绑定到您尝试遵循重定向的最后一个请求:

try:
    redir = r  # in case the first redirect fails
    for redir in session.resolve_redirects(r, r.request):
        if redir.status_code == 200 and not url_no_good(redir.url):  # ok!
            return redir.url
        else:
            tmp_url = redir.url
    else: # no acceptable responses :(
        return tmp_url
except requests.exceptions.TooManyRedirects:
    return url
except requests.exceptions.ConnectionError:
    return redir.headers.get('location', url)