在Python中,是否有预定义的URL类?

30

我正在寻找类似于java.net.URL的Python模块,Django,Zope或其他地方的东西。

最好从语义上考虑,因为对相关程序的分析结果表明URL在其中起着至关重要的作用。其结果是这样的URL类在该程序中也将具有很大的实际用途。

当然,我可以自己编写这样的类,但在开始“重新发明轮子”之前,我想四处看看。

我查看了urllib2urlparseurlparse基本上具有我需要的功能,但它没有像java.net.URL那样将其封装成一个类。根据我的程序分析,它的工作方式是颠倒的。

我还查看了urlparse的源代码中的SplitResultParseResult类。它们具有一些基本功能,可以用于子类化。但是,我将不得不重写剩余的urlparse函数作为子类方法。

我还发现了mxURL - Python的灵活URL数据类型。它非常接近我真正想要的东西。只是似乎对于我的目的来说过于复杂了。

有人能推荐另一个选项吗?我应该继续重新发明轮子吗?

我的解决方案:

要获取我的URL类,我基本上做了两件事:

  1. urlparse.ResultMixin继承。
  2. 定义一个函数,该函数仅调用urlparse.urlparse()并将结果转换为URL实例的参数。

1
为什么你需要一个类来做那件事? - Cat Plus Plus
2
@Cat Plus Plus:为URLs创建一个类非常方便。实际上,Python标准库中就包含了这样一个类。 - Fred Foo
@larsmans:实际上它并没有比命名元组更复杂。 - Cat Plus Plus
1
@Cat Plus Plus:你还期望URL类有什么更多的功能吗? ;) - Fred Foo
3
我认为拥有一个URL类是个好主意。URL像任何其他值对象一样。也许这更符合Java的哲学而非Python,例如,从字符串构造一个URL,然后获取协议、主机和路径等信息是一个非常强有力的例子。urlparse似乎已经完成了这项工作,但并没有否定使用Java类的理由。 - Joe
@larsmans 我会期望使用 url[key] = value 语法来设置 GET 参数。 - Ram Rachum
6个回答

25

urlparse函数将URL封装成一个名为ParseResult的类,因此它可以被视为这个类的工厂函数。这是来自Python文档的官方描述:

>>> urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')

如果您迫切需要一个名为URL的类来封装您的URL,请使用别名(URL = urlparse.ParseResult)或创建适配器。


3
ParseResult是一个命名元组。我不知道为什么会这样。我想要改变现有的URL,但在urllib中没有清晰的方法可以实现。 - n0nSmoker
1
@n0nSmoker 现在,我们在标准库中有了不可变的 pathlib。虽然你可以轻松地生成某种方式已更改的新 Path - George Sovetov

6

你可能想要考虑查看furl,因为它可能是你需要的答案。


谢谢。我真的很喜欢它!我会试一试的;-) - sumid
furl 的缺点是它不处理参数(并且不会处理)。但问题是谁需要“params”。 - sumid
GitHub url中可以看到,@sumid维护者说:“如果它们的使用增加,我很乐意添加它们(或接受拉取请求)。如果您需要参数,我相信您可以为此做出贡献! :)” - Wilfred Hughes

4

虽然有点晚,但是今天,pydantic 提供了多种URL类型,可以帮助验证、存储和传递URL;随着类型提示mypy越来越流行,一些人可能会认为这是某种标准。


4

截至2018年,我们拥有以下内容:

目前只有furl在维护,但它的主要缺点是它是可变的,这不鼓励最佳实践。(有一个现代的好参考——pathlib,它由不可变类组成。)

总的来说,拥有一种无痛的面向对象的方式来解析和构建URL非常好。

更新

yarl值得一看。


2

urlpath 是我处理 URL 的首选工具。它与 pathlib Path 对象相似。


0
>>> import urllib3
>>> help(urllib3.util.url)
...
CLASSES
Url(builtins.tuple)
    Url

class Url(Url)
 |  Url(scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None)
 |  
 |  Data structure for representing an HTTP URL. Used as a return value for
 |  :func:`parse_url`. Both the scheme and host are normalized as they are
 |  both case-insensitive according to RFC 3986.
 |  
 |  Method resolution order:
 |      Url
 |      Url
 |      builtins.tuple
 |      builtins.object

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接