api/Url

发布时间 2023-05-25 16:58:21作者: 挖洞404

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