python库的解析--URL解析(urllib.parse库)

from urllib.parse import *

"""
    urllib库的parse模块定义了处理URL的标准接口
"""

url = "https://so.iqiyi.com/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" \
      "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.com/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.com/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 待解析的URL
    scheme 默认的协议,假如URL链接没有协议信息,这个将会作为默认的协议
    allow_fragments 是否忽略fragment 
        如果他被设置为False,fragment将会被解析为path,query,params的一部分
    返回的会是一个urllib.request.ParserResult对象,实际上是一个元组
'''

# urllib.parse.urlunparse() 接受一个可迭代的长度为6的对象组成一个URL
data = [
    'https',
    'so.iqiyi.com',
    '/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.com/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.parse.SplitResult.geturl()返回url部分
print(result.geturl())
'''
    该方法类似于urllib.parse.urlparse()但不会单独解析params
'''

# urllib.parse.urlunsplit() 接受一个可迭代的长度为5的对象组成一个URL
data = [
    'https',
    'so.iqiyi.com',
    '/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 = "https://so.iqiyi.com/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" \
      "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
data = ";user=Mike"
print(urljoin(url, data))
'''
    urljoin(url, data)第一个参数成为base_url,提供scheme,netloc和path
    data作为新连接,如果新链接有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 = 'http://www.baidu.com'
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 = 'http://www.baidu.com'
urls = base_url + urlencode(params)
print(urls)
'''
    key和value都使用quote_via函数引用。默认情况下,quote_plus()用于引用值,这意味着空格被引用为“+”字符
'''

params = {
    
    
    'name': 'Mike',
    'age': 18,
    'friends': ('Tony', 'John')
}
base_url = 'http://www.baidu.com'
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 = "https://so.iqiyi.com/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" \
      "source=suggest&sr=17221995103565892&ssrt=20200825083940436&ssra=e219179a2de5e63fe9b2b80ce049a292#fragment"
result = urldefrag(url)
print(result)

# class urllib.parse.DefragResult()创建一个DefragResult对象
url = "https://so.iqiyi.com/so/q_%25E9%25A9%25AF%25E9%25BE%2599%25E9%25AB%2598%25E6%2589%258B?" \
      "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.quote(string, safe='/', encoding=None, errors=None)
# 将内容转化为URL编码格式(主要用于解决URL参数中带有中文出现乱码的问题)
kw = '英雄联盟'
url = 'http://www.baidu.com?kw='+quote(kw)
print(url)

# urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)
# 与quote()类似,但也可以用加号替换空格,这是在构建查询字符串以进入URL时引用HTML表单值所必需的
kw = '英雄联盟'
url = 'http://www.baidu.com?kw='+quote_plus(kw)
print(url)
'''
    这是在构建查询字符串以进入URL时引用HTML表单值所必需的
'''

# urllib.parse.quote_from_bytes(bytes, safe='/')
# 与quote()类似,但接受bytes对象而不是str,并且不执行字符串到字节的编码
kw = '英雄联盟'
url = 'http://www.baidu.com?kw='+quote_from_bytes(bytes(kw, encoding='UTF-8'))
print(url)

# urllib.parse.unquote(string, encoding='utf-8', errors='replace')
# 将URL进行解码
url = 'http://www.baidu.com?kw=%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字节
'''

猜你喜欢

转载自blog.csdn.net/hide_in_darkness/article/details/108215058