目前,仅支持以下几种协议: HTTP, ( 0.9版和 1.0版), FTP, 和本地文件。
urlretrieve()
的缓存功能已经被取消了,知道我有时间破解 headers 时间过期合适的处理方法。
应该有一个方法来查询特定的URL有没有在缓存中。
至于后向兼容,如果URL指向一个打不开的本地文件,那么URL会被重新使用FTP协议编译。 这个问题有时候会造成令人迷惑得错误信息。
urlopen()
和 urlretrieve()
函数会在等待网络连接建立时造成反复无常的长延迟。 这意味着很难建立一个不使用多线程的互动Web端(译者注:简而言之,就是要在程序中用异步获取来避免与用户的互动因为网络问题等响应很缓慢)
urlopen()
或 urlretrieve()
返回的未经过处理的是服务器返回数据is the raw data returned by the server.这可能会是二进制数据(比如图片),纯文本(举个例子)或者HTML。HTTP协议在返回头部中提供了类型信息,这可以通过查看"Content-Type"来检测, 如果返回的是HTML,你可以使用 htmllib
组件来解析(译者注:推荐BeautifulSoup)。
代码处理FTP协议处理文件和文件夹(目录)是没有差别的。这可能会在尝试读取一个指向不可访问的文件的URL时导致意外的行为。 如果URL以“/”
结尾,这会被认为指向文件夹并以对应的方式处理。但是如果尝试读取的文件导致了550错误(URL无法找到或这无法访问,通常是无权访问),然后路径就会被认为是目录,以处理通过URL指定的目录没加"/"的情况。这可能会造成错误的结果当你尝试无权访问的文件;FTP代码将会尝试去读取,报错550,然后对不可读取的文件执行目录列举。如果需要fine-grained(高密度?)控制,考虑使用ftplib
组件, FancyURLopener
子类, 或者改变urlopener 迎合你的需求.
这个组件不支持需要认证的代理,这个功能会在将来实现。
虽然 urllib
组件包含(没有做入文档)解析和反解析URL字符串的方案,推荐的URL操控接口还是在 urlparse
中。