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