urllib库(二)parse模块:urlparse()/urlsplit(),parse_qs()/parse_qsl(),urlunparse()/urlunsplit()
程序员文章站
2022-05-09 21:15:51
...
urllib.parse模块用于解析URL,支持对URL的操作包括拆分、拼接、编码、解码等。
urllib.parse模块在功能上分为两大类:URL parsing(URL解析)和URL quoting(URL引用)
一 、URL parsing
拆分和拼接:将url字符串拆分为各种组件,或者将url组件合并为url字符串
(1)urlparse()/urlsplit()
(1)urllib.parse.urlparse()函数:拆分url的6个组成部分
函数定义
urlparse(url, scheme='', allow_fragments=True)
Parse a URL into 6 components:
<scheme>://<netloc>/<path>;<params>?<query>#<fragment>
Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
注意6个组成部分的url的path和params之间是分号
参数
scheme:采用的协议。如果在urlstring中已指定,该参数可省略
注意的是只有在由"//"引导下的netloc字符串才会被正确识别,否则将被认为是path
allow_fragments:设置是否忽略fragment即锚点
该参数默认为True,即不忽略。如果设置为False,则该参数会被忽略
返回值
是一个<class 'urllib.parse.ParseResult'>对象,实际是一个包含url中6个元素的具名元组
具名元组本质还是一个元组 因此可通过元组下标访问ParseResult对象
同时具名元组的所有方法都适用于ParseResult对象
因此可通过具名元组关键字如scheme、netloc等访问 (推荐关键字 代码自动补全)
>>> import urllib.parse
>>> url= "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> urllib.parse.urlparse(url)
ParseResult(scheme='http', netloc='www.example.org', path='/default.html', params='', query='ct=32&op=92&item=98', fragment='')
>>> type(urllib.parse.urlparse(url))
<class 'urllib.parse.ParseResult'>
#也可以是
# url= "www.example.org/default.html?ct=32&op=92&item=98"
# pr=urllib.parse.urlparse(url,‘http’)
pr=urllib.parse.urlparse(url)
>>> pr.scheme
'http'
>>> pr[0]
'http'
注意区分urllib.parse.urlsplit()函数
具名元组传送门https://blog.csdn.net/bear_n/article/details/72837332)
(2)urllib.parse.urlsplit()函数:拆分url成5个部分,params将被合并到path中
其他用法与urlparse完全相同
函数定义
urlsplit(url, scheme='', allow_fragments=True)
Parse a URL into 5 components:
<scheme>://<netloc>/<path>?<query>#<fragment>
Return a 5-tuple: (scheme, netloc, path, query, fragment).
参数(同urlparse())
scheme:采用的协议。如果在urlstring中已指定,该参数可省略
注意的是只有在由"//"引导下的netloc字符串才会被正确识别,否则将被认为是path
allow_fragments:设置是否忽略fragment即锚点
该参数默认为True,即不忽略。如果设置为False,则该参数会被忽略
返回值
是一个<class 'urllib.parse.SplitResult'>对象 实际是一个包含5个元素的具名元组
具名元组本质还是一个元组 因此可通过元组下标访问SplitResult对象
同时具名元组的所有方法都适用于SplitResult对象
因此可通过具名元组关键字如scheme、netloc等访问 (推荐关键字 代码自动补全)
>>> import urllib.parse
>>> url= "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> pr=urllib.parse.urlsplit(url)
#也可以是
# url= "www.example.org/default.html?ct=32&op=92&item=98"
# pr=urllib.parse.urlsplit(url,‘http’)
>>> pr
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> type(pr)
<class 'urllib.parse.SplitResult'>
>>> pr.netloc
'www.example.org'
>>> pr[1]
'www.example.org'
(2)parse_qs()/parse_qsl()
urllib.parse.parse_qs()和urllib.parse.parse_qsl()函数
分析url中query字段 该字段通过parse.urlsplit(url).query得到
urllib.parse.parse_qs():
返回字典 其中value是一个列表,保存url中query中相同key的所有value值
因此获取真正的value值还需要列表下标遍历 如query[key][0]
urllib.parse.parse_qsl()
返回列表 列表的每一个元素是一个仅含两个元素的元组
每个元组的第一个元素为dict的key,第二个元素为dict的value
可通过dict()把仅含两个元素的元组组成的列表list转换成dict字典
因此
对于url的query字段中存在同一个key对应多个value的情况就只能通过
urlparse.parse_qs()实现,因为该函数可以把该相同key的value放在一个list中
from urllib import parse
url= "http://www.example.org/default.html?ct=32&op=92&item=98"
print("-------------parse_qs----------------")
qs = parse.parse_qs(parse.urlsplit(url).query)
print(type(qs))
print(qs)
# {'ct': ['32'], 'op': ['92'], 'item': ['98']}
print(type(qs['ct']))
print(qs['ct'])
print(qs['ct'][0])
print("-------------parse_qsl----------------")
qsl = parse.parse_qsl(parse.urlsplit(url).query)
print(type(qsl))
print(qsl)
# [('ct', '32'), ('op', '92'), ('item', '98')]
dic=dict(parse.parse_qsl(parse.urlsplit(url).query))
print(dic)
# {'ct': '32', 'op': '92', 'item': '98'}
运行结果
-------------parse_qs----------------
<class 'dict'>
{'ct': ['32'], 'op': ['92'], 'item': ['98']}
<class 'list'>
['32']
32
-------------parse_qsl----------------
<class 'list'>
[('ct', '32'), ('op', '92'), ('item', '98')]
{'ct': '32', 'op': '92', 'item': '98'}
(3)urlunparse()/urlunsplit()
urlunparse()函数与urlparse()函数刚好相反,urlunsplit()与urlsplit()相反
urlunparse(),urlunsplit()
用于url组件拼接成一个完整的url字符串
这两个函数接受一个列表或者元组作为形参,也可以是可迭代的对象。
返回str类型(url字符串)
注意urlunparse()六个参数<scheme>://<netloc>/<path>/<params>?<query>#<fragment>
必须都要指定,即便它不存在,也要指定为空
注意urlunsplit()五个参数<scheme>://<netloc>/<path>?<query>#<fragment>
必须都要指定,即便它不存在,也要指定为空
若params也存在,path中二者用分号隔开
from urllib.parse import urlunparse
url = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(url))
url1 = ['http','www.baidu.com','index.html;user','a=6','comment']
print(urlunsplit(url))
运行结果
http://www.baidu.com/index.html;user?a=6#comment
from urllib.parse import urlunparse
url = ['http','www.baidu.com','','','','']
print(urlunparse(url))
运行结果
http://www.baidu.com