一、url处理

python3中url处理包名称为urllib,其中主要功能模块如下:
error模块
parse模块
request模块
response模块
robotparse模块

1.1、url解析

举例1:

from urllib.parse import urlparse
url="http://alice:secret@www.hostname.com:80/%7Ealice/python.cgi?query=text#sample"
print(urlparse(url))     #调用urlparse模块中的urlparse方法,其他主要方法还有urljoin,urlsplit和urlunsplit等。

结果如下:
ParseResult(scheme='http', netloc='alice:secret@www.hostname.com:80', path='/%7Ealice/python.cgi', params='', query='query=text', fragment='sample')

说明:1’urlparse对于url定义是采用六元组,如下:
scheme://netloc/path;parameters?query#fragment。

>>> r.scheme
'http'
>>> r.netloc
'alice:secret@www.hostname.com:80'
>>> r.path
'/%7Ealice/python.cgi'
>>> r.params
''
>>> r.query
'query=text'
>>> r.fragment
'sample'
>>> r.username
'alice'
>>> r.password
'secret'
>>> r.hostname
'www.hostname.com'
>>> r.port
80
>>> r.geturl()
'http://alice:secret@www.hostname.com:80/%7Ealice/python.cgi?query=text#sample'
>>> r2=urlparse("www.pyton.or/about",'http')
>>> r2
ParseResult(scheme='http', netloc='', path='www.pyton.or/about', params='', query='', fragment='')

总结:

  1. 六元组中的每个值都是字符串,如果URL中不存在则为空值。这里网络地址部分没有进一步区分服务器地址和端口地址,而作为一个字符串
  2. 解析URL时候,所有的%转义符不会被处理。分隔符将会去掉,除了在路径中的第一个起始斜线外。
  3. urlparse方法返回的对象中的属性有scheme,netlocl,path,query(查询部分),params(参数)。另外还有两个可选参数,scheme和allow_fragments(指示是否可以对地址进行分片,默认值True)

    1.2、url的拼合

    >>> from urllib.parse import urljoin,urlsplit,urlunsplit #从模块中直接引入方法
    >>> r=urljoin("http://www.baidu.com","ice.html") #包含有绝对url和相对url
    >>> r
    'http://www.baidu.com/ice.html'

    说明:

>>> help(urljoin)
Help on function urljoin in module urllib.parse:
urljoin(base, url, allow_fragments=True)
    Join a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.

注意:当相对URL中如果有协议字段的话,则优先使用相对URL,否则使用绝对URL中协议字段。如:

>>> r=urljoin('http://www.python.org','ftp://www.python.org/faq')
>>> r                 #采用了后面相对地址协议值
'ftp://www.python.org/faq' 
>>> r=urljoin('http://www.python.org','www.python.org/faq')
>>> r               #当相对地址字符串不含有协议的时候,会默认为字符串
'http://www.python.org/www.python.org/faq'
 >>>r=urljoin("http://www.python.org/faq","http://www.python.org/ask")    #绝对url和相对url中都含有服务器地址且不相同,则采用相对url地址的服务器地址和路径
>>> r****
'http://www.python.org/ask'

1.3、url分解

urlsplit和urlparse类似,同样接受一个字符串,然后给出一个五元组。仅比urlparse方法少了param参数,从而由六元组变成五元组。
>>> from urllib.parse import urlsplit
>>> urlsplit("http://www.python.org:80/faq.cgi?src=file")
SplitResult(scheme='http', netloc='www.python.org:80', path='/faq.cgi', query='src=file', fragment='')  #也反映了网络的变化

而urlunsplit方法则是urlsplit的反向方法。是将通过urlsplit生成的的splitresult对象组合成一个URL字符串。这连个方法组合在一起可以有效地格式化URL,特殊字符可以在这个过程中得到转换

>>> >>> from urllib.parse import urlunsplit
>>> r=urlunsplit(("http","www.python.org","faq","","")) #传进的参数是一个五元组,也就是一个rulunsplit对象。
>>> r
'http://www.python.org/faq'