这一章进行解析链接的操作
urllib库里提供了一个parse模块,他定义了URL的标准接口,实现URL各部分的抽取,合并以及链接转换,它支持多种协议,如http,https,ftp,file等...
下面我们来介绍里面的一些方法:
- urlparse()
该方法可以实现URL的识别与分段
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result)
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http',
netloc='www.baidu.com',
path='/index.html',
params='user',
query='id=5',
fragment='comment')
可见返回结果为ParseResult类型,包含六个部分,分别为scheme,代表协议,第一个 / 前面为域名,即为netloc,后面是path,即为路径,分号前面为params,即为参数,问号后面为查询条件,一般用作查询条件的,用于GET类型的URL,#后面是瞄点,用于直接定位页面内部的下拉位置
所以一个链接的格式一般为:scheme://netloc/path;parms?query#fragment
利用urlparse可将其拆开来,但其还有更高级的用法,来看看他的API:
urllib.parse.urlparse(urlstring , scheme=' ' , allow_fragments=True)
- urlstring为必填项,是待解析的url。
- scheme为默认协议,比如http或https等,若这个链接没带协议,会默认为这个。当我们给出的url中没有相应的协议时,那么API中的scheme就会生效,如果我们给出的url中包含协议,那么我们API中的scheme就不会生效。
- allow_fragments:即是否忽略fragment。如果他被设置为False,那么fragment部分就会被忽略
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment',allow_fragments=False)
print(result)
可见fragment被忽略掉了,而当我们把params和query从URL里面省略时,则我们得到的fragment便会被解析为path的一部分
返回的ParseResult实际为一个元组:
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html#comment',allow_fragments=False)
print(result[0],result.scheme)
输出均为http,前者用的时索引,后者用的是属性
- urlunparse()
urlparse的对立方法,接受的参数为可迭代对象,但它的长度必须为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()
这个与urlparse很像,只不过他不再是单独解析params这一部分,只返回五个结果,上面的params会合并到path中去。
他返回的结果为SplitResult类,也是一个元组类型,即可以用元组也可以用属性来表示
- urlunsplit()
与urlunparse类似,唯一的区别也是一定要五个元素
- urljoin()
这是生成链接的第二种方法,我们可以提供给其一个base_url(基础链接),作为第一个参数,将新链接作为第二个参数,该方法会分析base_url的scheme,netloc和path这三个内容并对新链接缺失的部分进行补充,最后返回该结果
print(urljoin('http://www.baidu.com','FAQ.html'))
>>>http://www.baidu.com/FAQ.html
(PS:中间犯了个小错误,显示EOL while scanning string literal,即扫描字符串的时候没有,这一般是引号,括号成对出现的东西少了导致的)
可以得到base_url提供三项内容scheme,netloc,path当这三项在新的链接里不存在,就予以补充,如果在新链接里存在,就使用新链接的部分
- urlencode()
这个在构造GET请求时很有用,可将字典转为GET参数
from urllib.parse import urlencode
parms={
'name':'germy',
'age':'22'
}
base_url='http//www.baidu.com?'
url=base_url+urlencode(parms)
print(url)
>>>http//www.baidu.com?name=germy&age=22
- parse_qs()
这个相当于上面的对立方法,输入
name=germy&age=22
就会得到
{'name':'germy','age':'22'}
- parse_qsl()
这个输入相同的得到一个元组,相当于上面的字典改为了元组的方法
- quote()
可将中文字符转为URL编码实例如下:
from urllib.parse import quote
keyword = '壁纸'
url = 'http://www.baidu.com/s?wd'+ quote(keyword)
print(url)
>>>http://www.baidu.com/s?wd%E5%A3%81%E7%BA%B8
- unquote()
输入URL编码后的结果,可以解码回去
from urllib.parse import quote
url = 'http://www.baidu.com/s?wd%E5%A3%81%E7%BA%B8‘’
print(Unquote(url))
>>>http://www.baidu.com/s?wd=壁纸