前言
urllib.parse
urllib库的parse模块(英文单词parse的意思是解析,理解为解析url的模块)定义了url的标准接口,实现url的各种抽取。
parse模块的作用:url的解析,合并,编码,解码
urlparse:实现url的识别和分段
参数:
① url
② scheme=''
③ allow_fragments=True
代码1:
from urllib import parse
url = 'https://www.cn.com/angelyan/'
result = parse.urlparse(url=url,scheme='http',allow_fragments=True)
print(result)
print(result.scheme)
运行结果:由于解析的url是https协议,所以scheme参数指定的协议无效
代码2:
from urllib.parse import urlparse
url = 'http://user:pwd@NetLoc:80/path;param?query=arg#frag'
parsed = urlparse(url)
print(parsed)
print('scheme :', parsed.scheme)
print('netloc :', parsed.netloc)
print('path :', parsed.path)
print('params :', parsed.params)
print('query :', parsed.query)
print('fragment:', parsed.fragment)
print('username:', parsed.username)
print('password:', parsed.password)
print('hostname:', parsed.hostname)
print('port :', parsed.port)
运行结果:尽管返回值相当于一个元组,但实际上它基于一个 namedtuple ,这是 tuple的一个子类,除了可以通过索引访问,它还支持通过命名属性访问URL的各部分。
属性API不仅更易于程序员使用,还允许访问tupleAPI中未提供的很多值。
url解析后的返回值参数含义:
(scheme='https', netloc='www.cn.com', path='/angelyan/', params='', query='', fragment='')
① scheme
② netloc
③ path
④ params
⑤ query
⑥ fragment
urlsplit函数可以替换urlparse
但是urlsplit函数不会从URL分解参数
代码:
from urllib.parse import urlsplit
url = 'http://user:pwd@NetLoc:80/p1;para/p2;para?query=arg#frag'
parsed = urlsplit(url)
print(parsed)
print('scheme :', parsed.scheme)
print('netloc :', parsed.netloc)
print('path :', parsed.path)
print('query :', parsed.query)
print('fragment:', parsed.fragment)
print('username:', parsed.username)
print('password:', parsed.password)
print('hostname:', parsed.hostname)
print('port :', parsed.port)
运行结果:由于没有分解参数,tuple API会显示五个元素而不是六个,并且这里没有params属性。
要想从一个URL剥离出片段标识符:如从一个URL查找基页面名,可以使用 urldefrag()
from urllib.parse import urldefrag
original = 'http://netloc/path;param?query=arg#frag'
print('original:', original)
d = urldefrag(original)
print('url :', d.url)
print('fragment:', d.fragment)
运行结果:
urlunparse:利用urlunparse()可以将包含串的普通元组重新组合为一个URL。
代码:
from urllib import parse
# components:是一个可迭代对象,长度必须为6
url_parmas1 = ('https', 'www.cn.com', '/angelyan/', '', 'name=maple', 'log')
result1 = parse.urlunparse(url_parmas1)
print(result1)
url_parmas2 = ('https', 'www.cn.com', '/angelyan/', '', '', '')
result2 = parse.urlunparse(url_parmas2)
print(result2)
url_parmas3 = ('https', 'www.cn.com', '/AnyPath/', '', 'name=maple&sex=man', '')
result3 = parse.urlunparse(url_parmas3)
print(result3)
url_parmas4 = ('https', 'www.cn.com', '/AnyPath/', 'js', 'name=maple&sex=man', '')
result4 = parse.urlunparse(url_parmas4)
print(result4)
运行结果:由此可以看出,在一个长度为6的普通元组内,位置不同的元素代表的意义也不相同;可以参考 urlprase()
geturl:geturl()方法
代码:
from urllib.parse import urlparse
original = 'http://netloc/path;param?query=arg#frag'
print('ORIG :', original)
parsed = urlparse(original)
print('PARSED:', parsed.geturl())
运行结果: geturl() 只适用于 urlparse() 或 urlsplit()
urljoin:URL的相对片段构造绝对URL
可以类比: os.path.join()
代码1:
from urllib import parse
base_url = 'https://www.cn.com'
sub_url = '/AnyPath/?name=maple&sex=man#log'
full_url = parse.urljoin(base=base_url, url=sub_url, allow_fragments=True)
print(full_url)
运行结果:
代码2:
from urllib.parse import urljoin
print(urljoin('http://www.example.com/path/file.html',
'anotherfile.html'))
print(urljoin('http://www.example.com/path/file.html',
'../anotherfile.html'))
运行结果:在该例子中,计算第二个URL时要考虑路径的相对部分 "../"
代码3:
from urllib.parse import urljoin
print(urljoin('http://www.example.com/path/',
'/subpath/file.html'))
print(urljoin('http://www.example.com/path/',
'subpath/file.html'))
运行结果:
①如果连接到URL的路径是以一个斜线开头(/),那么 urljoin()
②如果连接到URL的路径不是以一个斜线开头,那么新路径值则追加到URL当前路径的末尾。
urlencode:将字典格式的参数序列化为url编码后的字符串,常用来构造get请求和post请求的参数
此时使用requests库请求接口会使用params形参
代码1:
from urllib import parse
parmas = {
'name': 'maple',
'age': 18
}
parmas_str = parse.urlencode(parmas)
print('将字典格式的数据序列化为url编码后的字符串:', parmas_str)
parmas_str = 'name=maple&age=18'
# 将url编码格式的参数反序列化为字典类型
parmas = parse.parse_qs(parmas_str)
print('将url编码后的字符串反序列化为字典格式的数据:', parmas)
运行结果:
代码2:
from urllib import parse
parmas = {
'name': '汉语参数',
'age': 18
}
parmas_str = parse.urlencode(parmas)
print('将字典格式的数据序列化为url编码后的字符串:', parmas_str)
parmas_str = 'name=%E6%B1%89%E8%AF%AD%E5%8F%82%E6%95%B0&age=18'
# 将url编码格式的参数反序列化为字典类型
parmas = parse.parse_qs(parmas_str)
print('将url编码后的字符串反序列化为字典格式的数据:', parmas)
运行结果:
quote:可以将中文转换为url编码格式
代码:
from urllib import parse
word = '中国梦'
url = 'http://www.baidu.com/s?wd='+parse.quote(word)
print('将中文参数转换为url编码格式后的参数:', parse.quote(word))
print('将中文参数转换为url编码格式后的新的url', url)
# unquote:可以将URL编码进行解码
url = 'http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6'
print('url解码之后新的url:', parse.unquote(url))
运行结果:
去期待陌生,去拥抱惊喜。