build_opener参数可以是许多个handler,中间用逗号分开。默认情况下:ProxyHandler,UnknowHandler,HTTPHandler,HTTPSHandler,HTTPDefaultErrorHandlerHTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessoropener这些处理程序是可用的。
bulid_opener()返回的OpenerDirector对象是具有open(url[,data[,timeout]])方法,其作用是根据各种处理程序提供的规则打开URL,当然我们可以使用install_opener(opener)来安装不同的opener对象作为urlopen()使用的全局URL opener。
下面给出部分build_opener()的代码:
def build_opener(*handlers):
opener = OpenerDirector()
default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]
if hasattr(httplib, 'HTTPS'):
default_classes.append(HTTPSHandler)
skip = set()
for klass in default_classes:
for check in handlers:
if isclass(check):
if issubclass(check, klass):
skip.add(klass)
elif isinstance(check, klass):
skip.add(klass)
for klass in skip:
default_classes.remove(klass)
for klass in default_classes:
opener.add_handler(klass())
for h in handlers:
if isclass(h):
h = h()
opener.add_handler(h)
return opener