介绍
parse模块是urllib库的一个工具模块,可用于对url解析、编码等操作。
主要方法
方法 | 说明 |
---|---|
urlparse | 对url各部分拆分 |
urlunparse | urlparse的反向操作,将各部分组合为url |
urlsplit | 对url各部分拆分(类似urlparse ) |
urlunsplit | urlsplit 的反向操作(类似urlsplit ) |
urljoin | 将url基础部分与额外部分进行合并 |
urlencode | 将dict对象转为query部分,同时可进行url编码 |
parse_qs | urlencode的反向操作,同时可进行解码,结构为dict |
parse_qsl | 类似parse_qs,但结果为tuple组成的list |
quote | 对字符进行url编码 |
unquote | quote的反向操作 |
urlparse
urlparse方法将完整的url分解为不同部分,结果类dict对象。
完整的url如下:
url = 'http://www.baidu.com/book/index.html;user?id=5#comment'
由6部分组成:
名称 | 值 | 说明 |
---|---|---|
scheme | http | 协议:通常为http或https |
netloc | www.baidu.com | 域名 |
path | /book/index.html | 路径:注意第1个字符为/ |
params | user | 参数:很少会用到该部分 |
query | id=5 | 查询:键值对,一般作为get请求的参数 |
comment | comment | 锚点:#后内容,用于在页面中定位 |
import urllib.parse
url1 = 'http://www.baidu.com/book/index.html;user?id=5#comment'
result1 = urllib.parse.urlparse(url1)
#解析结果可以用名称获取,也可以用下标获取
print(result1.netloc)
print(result1[3])
#额外参数scheme与allow_fragments
#如果url中不含有协议部分,可额外指定scheme;否则无效。
#allow_fragments=False,表示忽略fragment部分。
#忽略后整个id=a#comment都被分析为query部分。
url2 = 'www.baidu.com/book/index.html;user?id=a#comment'
result2 = urllib.parse.urlparse(url2,scheme="https",allow_fragments=False)
urlunparse
urlunparse将6个部分的值进行合并,结果为完整的url字符串。
data = ["http","www.baidu.com","index.html","user","a=10","comment"]
#必须按顺序设置6个部分的值,该方法不会自动进行url转码
print(urllib.parse.urlunparse(data))
urlsplit
urlsplit相比urlparse,只是不会将param与path分离,保存在path中。
因此,结果有5部分。
url1='http://www.baidu.com/book/index.html;user?id=5#comment'
result1 = urllib.parse.urlsplit(url1)
#path='/book/index.html;user'
urlunsplit
urlunsplit将5个部分的值进行合并
data = ["http","www.baidu.com","index.html;user","a=10","comment"]
print(urllib.parse.urlunsplit(data))
urljoin
url的6个部分分为基础部分(scheme,netloc,path)与附加部分(param,query,fragment)
urljoin可以使用备用的基础参数 确保url的完整性。
urljoin第1个参数包含备用的基础参数,如果第2个参数中缺乏基础参数,则用第1个参数的对应部分代替。
但是,第1个参数中的附加部分不会有任何效果。
urllib.parse.urljoin("http://www.baidu.com/index.html?b=20", "//www.my.com/index2.html?a=10")
#第1个参数只补充了协议部分
#http://www.my.com/index2.html?a=10
urlencode
url各部分在发起请求前都要进行url编码,特殊字符或中文等都会被转为%##的样式。
urlencode将dict类型对象序列化为query部分,符合 a=#&b=# 的格式。同时,可以指定编码。
params={
"name":"啊啊啊",
"age":22
}
#参数encoding指定编码
urllib.parse.urlencode(params, encoding="utf-8")
parse_qs
parse_qs用于反向序列化,首先将query部分解码,并转为dict对象。
注意:参数并非完整的url,可先用urlparse 拆分出query部分。
query="a=%E5%95%8A%E5%95%8A%E5%95%8A&b=20"
urllib.parse.parse_qs(query, encoding="utf-8")
parse_qsl
parse_qsl相比parse_qs,只是将结果转为tuple对象的list
urllib.parse.parse_qsl(url2, encoding="utf-8")
quote
quote将字符串进行url编码
keyword = "啊啊啊"
print("http://www.baidu.com/index?wd="+urllib.parse.quote(keyword, encoding="utf-8"))
unquote
unquote是对quote的反向操作,将url编码的字符串解码。
可直接用完整的url作为参数。
url="http://www.baidu.com/index?wd=%E5%95%8A%E5%95%8A%E5%95%8A"
urllib.parse.unquote(url)