urllib.parse模块定义了一个标准接口,既可以把统一资源定位符(URL)解析为若干部分(通信协议,网络地址和路径等),也可以把各个部分重新组合成URL,还可以利用“基本URL”把相对路径转化为绝对路径。
urllib.parse模块设计之初就考虑到要兼容一系列和URL相关的RFC标准。目前能够支持的URL协议包括:file, ftp, gopher, hdl,http, https, imap, mailto, mms, nntp, prospero, rsync, rtsp, rtspu, sftp, shttp, sip, sips, snews, svn, svn+ssh, telnet, wais, ws, wss。
urllib.parse定义的函数主要分为两类:URL解析和URL转义
urllib.parse.urlparse解析:
该函数将URL解析为6个部分,返回一个包含6个元素的named tuple,元组中每个元素都是一个字符串(也有可能为空字符串)。这些结构并不会再进行更细致的划分,并且不会还原url中带有的"%"转义。除了path开头的斜杠,各个部分之间的分割符号并不会在解析结果中出现
属性 | 索引 | 值 | 值(如果不存在) |
---|---|---|---|
scheme | 0 | URL方案说明符 | scheme parameter |
netloc | 1 | 网络位置部分 | 空字符串 |
path | 2 | 分层路径 | 空字符串 |
params | 3 | 最后路径元素的参数 | 空字符串 |
query | 4 | 查询组件 | 空字符串 |
fragment | 5 | 片段识别 | 空字符串 |
username | 用户名 | None | password |
密码 | None | hostname | 主机名(小写) |
None | port | 端口号为整数(如果存在) | None |
urlsplit解析:
属性 | 索引 | 值 | 值(如果不存在) |
---|---|---|---|
scheme | 0 | URL方案说明符 | scheme parameter |
netloc | 1 | 网络位置部分 | 空字符串 |
path | 2 | 分层路径 | 空字符串 |
query | 3 | 查询组件 | 空字符串 |
fragment | 4 | 片段识别 | 空字符串 |
username | 用户名 | None | password |
密码 | None | hostname | |
主机名(小写) | None | port端口号为整数(如果存在)None |
from urllib.parse import *"""urllib库的parse模块定义了处理URL的标准接口
"""url = "?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
# urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
# URL的识别和分段
result = urlparse(url=url)
print(result)url = "so.iqiyi/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
result = urlparse(url=url, scheme='https')
print(result)url = "so.iqiyi/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
result = urlparse(url=url, scheme='https', allow_fragments=False)
print(result)
'''url 待解析的URLscheme 默认的协议,假如URL链接没有协议信息,这个将会作为默认的协议allow_fragments 是否忽略fragment 如果他被设置为False,fragment将会被解析为path,query,params的一部分返回的会是一个quest.ParserResult对象,实际上是一个元组
'''# urllib.parse.urlunparse() 接受一个可迭代的长度为6的对象组成一个URL
data = ['https','so.iqiyi','/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B','','source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292','fragment'
]
print(urlunparse(data))# urllib.parse.urlsplit(url, scheme='', allow_fragments=True) URL的识别和分段
url = "so.iqiyi/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
result = urlsplit(url=url)
print(result)# urllib.url()返回url部分
url())
'''该方法类似于urllib.parse.urlparse()但不会单独解析params
'''# urllib.parse.urlunsplit() 接受一个可迭代的长度为5的对象组成一个URL
data = ['https','so.iqiyi','/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B','source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292','fragment'
]
print(urlunsplit(data))
'''urllib.parse.urlunparse和urllib.parse.urlunsplit传入的数据长度必须是规定的,否则会抛出参数数量不足或者过多的问题
'''# urllib.parse.urljoin(base, url,allow_fragments=True)
# 为了解决urllib.parse.urlunparse和urllib.parse.urlunsplit传入的数据长度必须是规定的
url = "?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
data = ";user=Mike"
print(urljoin(url, data))
'''urljoin(url, data)第一个参数成为base_url,提供scheme,netloc和pathdata作为新连接,如果新链接有scheme,netloc或path,则使用新链接中的数据
'''# urllib.parse.urlencode(uery, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
# 将数据转换成查询字符串格式,得到的字符串是一系列由'&'字符分隔的key=value键值对
params = {'name': 'Mike','age': 18
}
base_url = ''
urls = base_url + urlencode(params)
print(urlencode(params), urls)
'''如果要将urllib.parse.urlencode结果字符串用作urlopen()函数的POST操作的数据,则应将其编码为字节,否则将导致TypeError
'''params = {'name': 'Mike','age': 18,'friends': ('Tony', 'John')
}
base_url = ''
urls = base_url + urlencode(params)
print(urls)
'''key和value都使用quote_via函数引用。默认情况下,quote_plus()用于引用值,这意味着空格被引用为“+”字符
'''params = {'name': 'Mike','age': 18,'friends': ('Tony', 'John')
}
base_url = ''
urls = base_url + urlencode(params, doseq=True)
print(urls)
'''value元素本身可以是一个序列,在这种情况下,如果可选参数doseq的求值结果为True,则为键的值序列的每个元素生成单独的key=value对,用'&'分隔
'''# urllib.parse.parse_qs()
# (qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None)
# 反序列化GET请求参数,数据作为字典返回
query = 'source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292'
print(parse_qs(query))
'''可选参数keep_blank_values是一个标志,指示百分比编码查询中的空白值是否应视为空字符串真值表示应将空白保留为空白字符串默认的false值表示将忽略空白值,并将其视为未包含这些值。可选参数strict_parsing是一个标志,指示如何处理解析错误如果为false(默认值),则会自动忽略错误如果为true,则错误引发ValueError异常。可选的encoding和errors参数指定如何将百分比编码序列解码为Unicode字符可选参数max_num_fields是要读取的最大字段数如果设置,则如果读取的字段超过max_num_字段,则抛出ValueError。
'''# urllib.parse.parse_qsl()
# (qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None)
# 反序列化GET请求参数,数据作为列表返回
query = 'source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292'
print(parse_qsl(query))
'''第一个内容是参数名,第二个内容是参数值
'''# urllib.parse.urldefrag()返回一个DefragResult对象
# 如果url包含片段标识符(锚点#),则返回没有片段标识符的url的修改版本,并将片段标识符作为单独的字符串返回
# 如果url中没有片段标识符(锚点#),则返回未修改的url和空字符串
url = "?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
result = urldefrag(url)
print(result)# class urllib.parse.DefragResult()创建一个DefragResult对象
url = "?" "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292"
fragment = 'fragment'
result = DefragResult(url, fragment)
print(result)
'''class urllib.parse.ParseResult(scheme, netloc, path, params, query, fragment)创建一个ParseResult对象class urllib.parse.SplitResult(scheme, netloc, path, query, fragment)创建一个SplitResult对象class urllib.parse.DefragResultBytes(url, fragment)创建一个SDefragResultBytes对象class urllib.parse.ParseResultBytes(scheme, netloc, path, params, query, fragment)创建一个ParseResultBytes对象class urllib.parse.SplitResultBytes(scheme, netloc, path, query, fragment)创建一个SplitResultBytes对象
'''# urllib.parse.unwrap(url)
# 本函数用于从一个被包裹的URL(形如<URL:scheme://host/path>,
# <scheme://host/path>, URL:scheme://host/path or
# scheme://host/path)中摘取出实际URL。如果url没有被包裹,则返回原始值
url = "<URL:;"
result = urllib.parse.unwrap(url)
print(result)# urllib.parse.quote(string, safe='/', encoding=None, errors=None)
# 将内容转化为URL编码格式(主要用于解决URL参数中带有中文出现乱码的问题)
# %xx的形式转义特殊字符,但是字母、数字以及 _ . - ~ 这几个字符是不会被转义的。
# 默认情况下,该函数是为了转义URL中的path部分。当然,可以通过safe参数,明确指定哪些ASCII字符不希望被转义,其缺省值为"/"
kw = '英雄联盟'
url = '='+quote(kw)
print(url)# urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)
# 与quote()类似,但也可以用加号替换空格,这是在构建查询字符串以进入URL时引用HTML表单值所必需的
kw = '英雄联盟'
url = '='+quote_plus(kw)
print(url)
'''这是在构建查询字符串以进入URL时引用HTML表单值所必需的
'''# urllib.parse.quote_from_bytes(bytes, safe='/')
# 与quote()类似,但接受bytes对象而不是str,并且不执行字符串到字节的编码
kw = '英雄联盟'
url = '='+quote_from_bytes(bytes(kw, encoding='UTF-8'))
print(url)# urllib.parse.unquote(string, encoding='utf-8', errors='replace')
# 将URL进行解码
url = '=%E8%8B%B1%E9%9B%84%E8%81%94%E7%9B%9F'
result = unquote(url)
print(result)# urllib.parse.unquote_plus(string, encoding='utf-8', errors='replace')
'''与unquote()类似,但也可以将加号替换为空格,这是对HTML表单值不加引号所必需的
'''# urllib.parse.unquote_to_bytes(string)
'''字符串可以是str或字节如果是str,则字符串中未经转义的非ASCII字符将编码为UTF-8字节
'''
本文发布于:2024-02-04 06:22:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170700945253063.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |