python2和python3中的urllib
urllib提供了一个高级的 Web 通信库,支持基本的 Web 协议,如 HTTP、FTP 和 Gopher 协议,同时也支持对本地文件的访问。
具体来说,urllib 模块的功能是利用前面介绍的协议来从因特网、局域网、本地主机上下载数据。
使用这个模块就无须用到 httplib、ftplib和 gopherlib 这些模块了,除非需要用到更低层的功能。
Python 2 中有 urlib、urlparse、urllib2,以及其他内容。在 Python 3 中,所有这些相关模块都整合进了一个名为 urllib 的单一包中。
urlib 和 urlib2 中的内容整合进了 urlib.request模块中,urlparse 整合进了 urllib.parse 中。
Python 3 中的 urlib 包还包括 response、error 和robotparse 这些子模块。
URL的格式
prot_sch://net_loc/path;params?query#frag
URL的各个部分(Web地址的各个组件)
prot_sch 网络协议或下载方案 net_loc 服务器所在地(也含有用户信息) path 使用斜杠(/)分割的文件或CGI应用的路径 params 可选参数 query 连接符(&)分割的一系列键值对 frag 指定文档内特定锚的部分 net_loc 可以进一步拆分成多个组件,一些是必备的,另一些是可选的: user:passwd@host:port user 用户名或登录 passwd 用户密码 host 运行web服务器的计算机名称或地址(必须的) port 端口号(如果不是默认的80)
urllib.parse模块
在python2中叫做urlparse,在python3中已经改名为urllib.parse
urllib.parse 模块提供了一些基本功能,用于处理 URL 字符串。这些功能包括 urlparse()、urlunparse()和 urljoin()。
urlparse()将 urlstr 解析成一个 6 元组(prot_sch, net_loc, path, params, query, frag):
语法:urlparse(urlstr, defProtSch=None, allowFrag=None) >>> urllib.parse.urlparse("https://www.smelond.com?cat=6") ParseResult(scheme=‘https‘, netloc=‘www.smelond.com‘, path=‘‘, params=‘‘, query=‘cat=6‘, fragment=‘‘)
urlunparse()的功能与 urlpase()完全相反,其将经 urlparse()处理的 URL 生成 urltup 这个 6元组(prot_sch, net_loc, path, params, query, frag),拼接成 URL 并返回:
语法:urlunparse(urltup) >>> result = urllib.parse.urlparse("https://www.smelond.com") >>> print(result) ParseResult(scheme=‘https‘, netloc=‘www.smelond.com‘, path=‘‘, params=‘‘, query=‘‘, fragment=‘‘) >>> urllib.parse.urlunparse(result) ‘https://www.smelond.com‘
在需要处理多个相关的 URL 时我们就需要使用 urljoin()的功能了,例如,一个 Web 页中可能会产生一系列页面 URL:
urljoin()取得根域名,并将其根路径(net_loc 及其前面的完整路径,但是不包括末端的文件)与 newurl 连接起来。
语法:urljoin (baseurl, newurl, allowFrag=None) >>> urllib.parse.urljoin("https://www.smelond.com?cat=6","?cat=7") ‘https://www.smelond.com?cat=7‘ >>> urllib.parse.urljoin("https://www.smelond.com?cat=6","abc") ‘https://www.smelond.com/abc‘ >>> urllib.parse.urljoin("https://www.smelond.com?cat=6","/test/abc.html") ‘https://www.smelond.com/test/abc.html‘ >>> urllib.parse.urljoin("https://www.smelond.com","abc.html") ‘https://www.smelond.com/abc.html‘
urllib.parse 模块中的核心函数描述
urlparse(urlstr,defProSch=None,allowFrag=None) 将urlstr解析成各个组件,如果在urlstr中没有给定协议或方案,则使用defProtSch;allowFrag 决定是否允许有 URL 片段 urlunparse(urltup) 将 URL 数据(urltup)的一个元组拼成一个 URL 字符串 urljoin(baseurl, newurl, allowFrag=None) 将 URL 的根域名和 newurl 拼合成一个完整的 URL;allowFrag 的作用和urlpase()相同