Python的urllib模块提供了一个高级的Web通信库,支持基本的协议,如HTTP、FTP和Gopher,同时也支持对本地文件的访问。在Python3中,urllib、urlparse、urllib2等都整合进一个名为urllib的单一包中。urllib、urllib2的内容整合进了urllib.request模块中,urlparse整合进了urllib.parse模块中。Python3中的urllib包还包括response、error、robotparse这些子模块。下面就来看看Python3中核心模块urllib的用法大全吧。
urllib.parse
一般来说,一个URL的地址是可以分为六部分的。urllib.parse模块就是对Web网址进行解析,分解或合并成URL。主要的方法有urlparse、urlunparse、urljoin。示例代码如下:
#!/usr/local/env python # coding:utf-8 import urllib.parse __author__ = "风轻清淡" url = "https://www.noniu.com/module;path?id=12#22" ret = urllib.parse.urlparse(url) # 结果为:ParseResult(scheme='http', netloc='www.noniu.com', path='/module', params='path', query='id=12', fragment='22') # 可以通过索引访问所有的结果,分别代表:网络协议、服务器地址、CGI应用路径、可选参数、查询的键值对、文档内定锚 print(ret) url_str = ("http", "www.noniu.com", "/jiaocheng/228.html", "", "", "") url_ret = urllib.parse.urlunparse(url_str) # 结果为:https://www.noniu.com/jiaocheng/228.html # urlunpars与urlparse相当于相反的操作 print(url_ret) url_join = urllib.parse.urljoin("https://www.noniu.com/about/", "/jiaocheng/228.html") # 结果为:https://www.noniu.com/jiaocheng/228.html # urljoin方法将URL的根域名与新的路径拼合为一个完整的URL print(url_join)
urllib.request
urllib.request模块中有urlopen、urlretrieve、quote等方法,具体的参数和功能见下表:
urllib.request中的方法 | 描述 |
urlopen(urlstr, postQueryData=https://www.noniu.com/jiaocheng/None) | 打开URL urlstr,如果是POST请求,则通过postQueryData发送请求的数据 |
urlretrieve(urlstr, localfile=None, downloadStatusHook=None) | 将URL urlstr中的文件下载到localfile或临时文件夹中(localfile没指定);如果函数正在执行,downloadStatusHook将获得下载的统计信息。 |
quote(urldata, safe="/") | 对urldata在URL中无法使用的字符进行编码,safe中的字符不做处理。 |
quote_plus(urldata, safe="/") | 除了将空格编码为+号(而非%20)之外,其他功能和quote没有区别 |
unquote(urldata) | 将urldata中编码过的字符解码 |
unquote_plus(urldata) | 除了将+号解码为空格之外,其他功能和unquote没有区别 |
urlencode(dict) | 将dict的键值对通过quote_plus编码为有效的CGI查询字符串 |
以下是urllib.request模块中具体方法的示例代码:
#!/usr/local/env python # coding:utf-8 import urllib.request __author__ = "风轻清淡" url = "https://www.noniu.com/index.php" ret = urllib.request.urlopen(url) # 结果为:b'<!doctype html>\n' # 连接成功后,urlopen返回一个文件类型对象,可以使用read、readline等文件操作方法进行读取,数据为字节类型。 print(ret.readline()) # 结果为:https://www.noniu.com/index.php # geturl方法是考虑所有重定向后,获取真实的URL print(ret.geturl())