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))
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!