我正在使用urllib.request在python 3.6中执行一系列http调用。我需要检索为响应urllib.request.urlopen调用而返回的302 http重定向的值,如此...
import urllib.request
... many previous http calls ...
post_data = {'foo': 'bar', 'some': 'otherdata'}
encoded = urllib.parse.urlencode(post_data).encode('utf-8')
req = urllib.request.Request('https://some-url', encoded)
redirected_url = urllib.request.urlopen(req).geturl()
我收到类似错误的错误
urllib.error.HTTPError: HTTP Error 302: Found - Redirection to url 'gibberish://login_callback?code=ABCD......' is not allowed
我需要的是实际获取302中返回的urt,因为.geturl()方法应该提供,但我得到一个错误。
请不要回答“嘿,使用我现在超级的其他库”,因为我们花了很长时间使用urllib2构建这个脚本,而且我们对python知识很少。
感谢您的帮助。
答案 0 :(得分:2)
如果您不想使用请求库(此时几乎是核心库的一部分),您需要使用urllib2编写自定义HTTPRedirectHandler。
import urllib2
class CustomHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
### DO YOUR STUFF HERE
return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
http_error_301 = http_error_303 = http_error_307 = http_error_302
opener = urllib2.build_opener(CustomHTTPRedirectHandler)
post_data = {'foo': 'bar', 'some': 'otherdata'}
encoded = urllib.parse.urlencode(post_data).encode('utf-8')
req = urllib.request.Request('https://some-url', encoded)
opener.urlopen(req)