乌鸡人参汤 2022-07-12 09:52 采纳率: 100%
浏览 67
已结题

python语言解析URL

输入规格
每行一个待解析的URL字符串,整行读入,处理到EOF为止。
输出规格
对每个URL,以JSON格式输出解析结果:

{
"scheme": "",
"authority": {
"user": "",
"host": "",
"port": 0,
},
"path": "",
"query": {},
"fragment": ""
}
每级缩进为2个空格。
如某个成分不存在,对应的值输出null。如成分存在但为空,输出空串。
端口特殊处理:按整数输出,不加引号。如未指定则输出默认端口。
authority为空时值设为null。
query
如不存在(没有?部分)输出null
如存在,根据&拆分成多个键值对,再根据=取出键和值。
如存在但没有值,输出{}
fragment
如不存在(没有#部分)输出null
如存在,值为#后的部分(可能为空串)。
样例输入
http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5
https://gitee.com/codearhat/cpplab.git?#
ftp://guest@127.0.0.1:2121/pub/rfc3986.txt
样例输出
{
"raw_url": "http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5",
"scheme": "http",
"authority": {
"user": "admin",
"host": "127.0.0.1",
"port": 9999
},
"path": "/manual/search.php",
"query": {
"target": "print",
"limit": "10"
},
"fragment": "view=fit&row=5"
}
{
"raw_url": "https://gitee.com/codearhat/cpplab.git?#%22,
"scheme": "https",
"authority": {
"user": null,
"host": "gitee.com",
"port": 443
},
"path": "/codearhat/cpplab.git",
"query": {},
"fragment": ""
}
{
"raw_url": "ftp://guest@127.0.0.1:2121/pub/rfc3986.txt",
"scheme": "ftp",
"authority": {
"user": "guest",
"host": "127.0.0.1",
"port": 2121
},
"path": "/pub/rfc3986.txt",
"query": null,
"fragment": null
}
样例解释
第1组:成分齐全。
第2组:有认证部分,但没用户名,补充默认端口。query和fragment部分存在,内容为空,输出空对象和空串。
第3组:没有query或fragment部分。

  • 写回答

4条回答 默认 最新

  • 鸡蛋酱$ 2022-07-12 11:18
    关注
    
    import json
    
    
    def my_split(string: str, op: str, index: int) -> str:
        """
        :param string:
        :param op:
        :param index:
        :return:
        """
        if op in string:
            return string.split(op)[index]
        return "null"
    
    
    def operate(link: str) -> str:
        """
        :param link:
        :return:
        """
        raw_url = link
        scheme = link.split(":")[0]
        data = "".join(link[len(scheme):])[3:].split('/')
        data[1] = data[1] + data[2]
        data.pop(-1)
        user = my_split(data[0], "@", 0)
        host = ""
        if user != "null":
            host += my_split("".join(data[0].split('@')[1:]), ":", 0)
        else:
            host += data[0]
        port = my_split(data[0], ":", -1)
        if port == "null":
            port = 443
        else:
            port = int(port)
        path = ""
        fragment = ""
        query = {}
        if "?" in data[1]:
            path = data[1].split('?')[0]
            fragment = my_split(data[1], "#", -1)
            keys = "".join(data[1].split('?')[1:]).split("#")[0].split("&")
            if keys[0] != "":
                for i in keys:
                    query[i.split('=')[0]] = i.split('=')[1]
        else:
            path = data[1]
            fragment = "null"
        res = {"raw_url": raw_url, 'scheme': scheme, "authority": {"user": user, "host": host, "port": port}, "path": path,
               "query": query, "fragment": fragment}
        res = json.dumps(res, indent=4, separators=(',', ': '))
        return res
    
    
    if __name__ == '__main__':
        url_arr = ["http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5",
                   "https://gitee.com/codearhat/cpplab.git?#",
                   "ftp://guest@127.0.0.1:2121/pub/rfc3986.txt"]
        for url in url_arr:
            result = operate(url)
            print(result)
    
    

    img


    python里面的你的null我用“null”,需要空值的话你可以自己再转换一下,其他人的答案都可以,转有空格的字符串你可以用json库操作

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月13日
  • 已采纳回答 7月12日
  • 创建了问题 7月12日

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥15 this signal is connected to multiple drivers怎么解决
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus