from urllib import parse模块的使用:url的解析,合并,编码,解码

前言

 ①urllib.parse 模块提供了一些函数,可以管理URL及其组成部分,这包括将URL分解为组成部分以及由组成部分构成URL。

 ②urllib库的parse模块(英文单词parse的意思是解析,理解为解析url的模块)定义了url的标准接口,实现url的各种抽取

 ③parse模块的作用:url的解析,合并,编码,解码

urlparse:实现url的识别和分段

参数:

① url :待解析的url。

② scheme='' :假如解析的url没有协议,可以设置默认的协议;但是如果url存在协议,设置scheme参数无效。

③ allow_fragments=True :是否忽略锚点,默认为True表示不忽略,为False表示忽略。

代码1:

from urllib import parse

url = 'https://www.cnblogs.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.cnblogs.com', path='/angelyan/', params='', query='', fragment='')

① scheme :表示url使用的网络协议

② netloc :域名

③ path :路径

④ params :参数

⑤ query :查询条件,一般都是get请求的url才会有此出参

⑥ 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.cnblogs.com', '/angelyan/', '', 'name=maple', 'log')
result1 = parse.urlunparse(url_parmas1)
print(result1)

url_parmas2 = ('https', 'www.cnblogs.com', '/angelyan/', '', '', '')
result2 = parse.urlunparse(url_parmas2)
print(result2)

url_parmas3 = ('https', 'www.cnblogs.com', '/AnyPath/', '', 'name=maple&sex=man', '')
result3 = parse.urlunparse(url_parmas3)
print(result3)

url_parmas4 = ('https', 'www.cnblogs.com', '/AnyPath/', 'js', 'name=maple&sex=man', '')
result4 = parse.urlunparse(url_parmas4)
print(result4)

运行结果:由此可以看出,在一个长度为6的普通元组内,位置不同的元素代表的意义也不相同;可以参考 urlprase() 函数将标准URL解析后的元组内的各元素定位。

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.cnblogs.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的路径不是以一个斜线开头,那么新路径值则追加到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))

运行结果:

 

posted @ 2021-11-08 11:12  习久性成  阅读(1165)  评论(0编辑  收藏  举报