目录
urlparse()? :实现URL的识别和分段
urlparse() 方法其他API用法
urlunparse() :实现URL拼接
urlsplit():?解析URL把params和并到path中
urlunsplit()? :完成链接拼接
urljoin():完成链接的合并
urlencode() :序列化为GET请求参数
parse_qs():反序列:字典
parse_qsl()? 反序列化:列表
quote() :将内容转化为URL编码的格式
unquote():将URL内容解码
urllib库里还提供了parse模块,它定义了处理URL的标准接口,例如实现URL各部分的抽取,合并以及链接转换。它还支持如下协议的RUL处理:file,ftp,gopher,hdl,http,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,svn+ssh,telnet和wais。
urlparse()? :实现URL的识别和分段
from urllib.parse import urlparse
result = urlparse("https://www.baidu.com/s/index.html;user?id=5#comment")
print(type(result) ,result)
结果:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.baidu.com', path='/s/index.html', params='user', query='id=5', fragment='comment')
可以看到:返回结果是一个ParseResult对象,它包含6个部分,分别是 scheme,nteloc,path,params,query,fragment。
大致可以看到urlparse()? 方法将其拆分成6个部分。大体观察可以发现,解析是有特定的分隔符。
- ://? :前面的就是scheme,代表协议;
- 第一个 /?符号前面便是netloc,即域名
- 后面是path,即访问路径;
- 分号; 前面是params
- 问号 ? 后面是查询条件query,一般用作GET类型的URL;
- 井号#,后面是描点,用户直接定位页面内部的下拉位置
总上大体得出一个标准的链接格式:scheme://netloc/path;params?query#fragment
urlparse() 方法其他API用法
def urlparse(url, scheme='', allow_fragments=True)
urlstring:这是必填项,即待解析的URL scheme:他是默认的协议(比如http或是https等),假如这个链接没有携带信息,会将这个作为默认的协议。
from urllib.parse import urlparse
result = urlparse(url="www.baidu.com/s/index.html;user?id=5#comment",scheme="https")
print(type(result) ,result)
结果
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='', path='www.baidu.com/s/index.html', params='user', query='id=5', fragment='comment')
1、提供的URL没有包含坐前面的scheme信息,但是通过指定默认的 scheme参数,返回的结果是https
from urllib.parse import urlparse
result = urlparse(url="http://www.baidu.com/s/index.html;user?id=5#comment",scheme="https")
print(type(result) ,result)
结果:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/s/index.html', params='user', query='id=5', fragment='comment')
2、scheme参数只有在URL中不包含scheme信息是才生效,如果URL中有scheme信息就会返回scheme;
allow_fragments:是否忽略fragment。如果他被设置为False,fragment部分就会被忽略,他会被解析为path、parameters或者query的一部分,而fragment部分为空。 ?
from urllib.parse import urlparse
result = urlparse(url="http://www.baidu.com/s/index.html;user?id=5#comment",allow_fragments=False)
print(type(result) ,result)
结果:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/s/index.html', params='user', query='id=5#comment', fragment='')
URL中不包含params和query,我们再看下
from urllib.parse import urlparse
result = urlparse(url="http://www.baidu.com/s/index.html#comment",allow_fragments=False)
print(type(result) ,result)
结果:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/s/index.html#comment', params='', query='', fragment='')
通过上面我们可以发现,当URL中不包含params和query时,fragment便会解析为path的一部分
结果返回ParseResult实际上时一个元组,可已通过索引顺序来获取,也可以通过属性名获取 ?
from urllib.parse import urlparse
result = urlparse(url="http://www.baidu.com/s/index.html#comment",allow_fragments=False)
print(type(result) ,result[0],result.netloc,result[1],sep='\n')
结果
<class 'urllib.parse.ParseResult'>
http
www.baidu.com
www.baidu.com
urlunparse() :实现URL拼接
有了urlparse(),相应地就有了它的对立方法urlunparse(),它接受的参数是一个可迭代对象,但是它的长度必须是6,否则会抛出参数数量不足或者过多的问题:
from urllib.parse import urlunparse
data = ["http","www.baidu.com","index.html","user","a=6","comment"]
print(urlunparse(data))
结果:
http://www.baidu.com/index.html;user?a=6#comment
urlsplit():?解析URL把params和并到path中
urlsplit() 和 urlparse() 方法非常的相似,只不过它不再单独解析params这一部分,只返回5个结果。上面例子中的params会合并到path中
from urllib.parse import urlsplit
resutl = urlsplit("http://www.baidu.com/index.html;user?a=6#comment")
print(resutl)
结果
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='a=6', fragment='comment')
返回的结果:SplitResult,它其实也是一个元组类型,既可以用属性获取值,也可以用索引来获取
from urllib.parse import urlsplit
resutl = urlsplit("http://www.baidu.com/index.html;user?a=6#comment")
print(resutl.scheme,resutl[1])
结果
http www.baidu.com
urlunsplit()? :完成链接拼接
与urlunparse() 类似,他也是将链接各个部分组合完整的方法,传入的参数也是一个可迭代对象,列如列表、元组等,唯一的区别是长度必须为5
from urllib.parse import urlunsplit
data = ["http","www.baidu.com","index.html","a=6","comment"]
print(urlunsplit(data))
结果:
http://www.baidu.com/index.html?a=6#comment
urljoin():完成链接的合并
有了urlunparse() 和 urlunsplit()? 方法,我们可以完成链接的合并,不过前提必须要有特定长度的对象,链接的每一部分都要清晰分开
生成链接还有另外一个方法,那就是urljoin()? 方法,我们可以提供一个 base_url (基础链接) 作为第一个参数,将新的链接作为第二个参数,改方法会分析base_url 的 scheme、netloc和path这三个内容并对新链接缺失的部分进行补充,最后返回结果? ??
from urllib.parse import urljoin
print(urljoin("http://www.baidu.com","FAQ.html"))
print(urljoin("http://www.baidu.com","https://cuiqingcal.com/FAQ.html"))
print(urljoin("http://www.baidu.com/about.html","https://cuiqingcal.com/FAQ.html"))
print(urljoin("http://www.baidu.com/about.html","https://cuiqingcal.com/FAQ.html?question=2"))
print(urljoin("http://www.baidu.com?wd=abc","https://cuiqingcal.com/index.hph"))
print(urljoin("http://www.baidu.com","?category=2#comment"))
print(urljoin("www.baidu.com","?category=2#comment"))
print(urljoin("www.baidu.com#comment","?category=2"))
结果
http://www.baidu.com/FAQ.html
https://cuiqingcal.com/FAQ.html
https://cuiqingcal.com/FAQ.html
https://cuiqingcal.com/FAQ.html?question=2
https://cuiqingcal.com/index.hph
http://www.baidu.com?category=2#comment
www.baidu.com?category=2#comment
www.baidu.com?category=2
综上:base_url提供了三项内容:scheme、netloc和path。如果这3项在新的链接里不存在,就予以补充;如果新的连接存在,就使用新的链接部分,而base_url中的params,query和fragment是不起作用的。
urlencode() :序列化为GET请求参数
urlencode(),它在构造GET请求参数的时候非常有用
from urllib.parse import urlencode
params = {
"mame":"germey",
"age":"22"
}
base_url = "http://www.baidu.com"
url = base_url + urlencode(params)
print(url)
结果
http://www.baidu.commame=germey&age=22
这里调用urlencode()方法将其序列化为GET请求参数;参数就成功地由字典转化为GET请求参数了
parse_qs():反序列:字典
有了序列化,必然就会有反序列化,如果我们有一串GET参数,利用parse_qs()? 方法,就可以将他转化为字段,示例如下:
from urllib.parse import parse_qs
query = "name=germey&age=32"
print(parse_qs(query))
结果:
{'name': ['germey'], 'age': ['32']}
parse_qsl()? 反序列化:列表
parse_qsl()方法,它用于将参数转化为元组组成的列表
from urllib.parse import parse_qsl
query = "name=germey&age=32"
print(parse_qsl(query))
结果:
[('name', 'germey'), ('age', '32')]
运行结果是一个列表,而列表中的每一个元素都是一个元组,元组的第一个内容是参数名,第二个内容是参数值
quote() :将内容转化为URL编码的格式
改方法可以将内容转化为URL编码的格式。URL中带有中文参数时,有时可能会导致乱码的问题,此时用这个方法可以将中文符号转化为URL编码,示例如下:
from urllib.parse import quote
keyword = "中国"
url = "http://www.baidu.com/s?wd=" +quote(keyword)
print(url)
结果:
http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD
unquote():将URL内容解码
有了quote() 方法当然还有unquote() 方法,它可以进行URL解码, ?
from urllib.parse import unquote
url = "http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD"
print(unquote(url))
结果:
http://www.baidu.com/s?wd=中国
|