1、介绍
url是常见的对象,为了方便使用,定义为类。
- 自定义Url类,包括五个对象变量:
- scheme协议名称,一般为http://或https://
- hostname主机名称,可能是ip、域名或者是localhost。需要注意,可能还包含用户名username和密码password部分
- port端口,可能不存在。如果存在,为:8080形式
- path路径,可能不存在。如果存在,为/a/b/c形式
- query直接参数,可能不存在。如果存在,为?name=&password=形式
- fragment部分,可能不存在。如果存在,为#123456形式
- 为了方便处理,各对象属性按序拼接,即为初始的url字符串。即解析过程中,既不会省略某些结构字符,也不会进行其它转换。
2、api/Url
import json
import re
'''
url对象
'''
class Url:
def __init__(self, s=''):
# 协议名称,一般为http://或https://
self.schema = ''
# 主机名称,可能包含用户名和密码部分,可能是ip、域名或者是localhost
self.hostname = ''
# 端口,可能不存在。如果存在,为:8080形式
self.port = ''
# 路径,可能不存在。如果存在,为/a/b/c形式
self.path = ''
# 直接参数,可能不存在。如果存在,为?name=&password=形式
self.query = ''
# hash部分,可能不存在。如果存在,为#123456形式
self.fragment = ''
self.parse(s=s)
def parse(self, s: str):
if s != '':
pattern = '^([a-zA-Z]+://)([^:/?#\\s]+)(:[0-9]*)?(/[^?#]*)?([?][^#]*)?(#\\S*)?'
result = re.findall(pattern=pattern, string=s)
if result:
self.set_url(result[0])
def set_url(self, args):
self.schema = args[0]
self.hostname = args[1]
self.port = args[2]
self.path = args[3]
self.query = args[4]
self.fragment = args[5]
def __str__(self):
return json.dumps({
'schema': self.schema,
'hostname': self.hostname,
'port': self.port,
'path': self.path,
'query': self.query,
'fragment': self.fragment,
})
def toString(self):
return self.schema + self.hostname + self.port + self.path + self.query + self.fragment
def clone(self):
u = Url()
u.set_url([self.schema, self.hostname, self.port, self.path, self.query, self.fragment])
return u
"""
将一个url进行分解,元素0包括协议、域名、端口信息,路径按/进行分割,不包括参数部分
"""
def address_arr(self):
result = [self.schema + self.hostname + self.port]
if self.path != '':
result.extend(self.path.split('/')[1:])
return result