使用urlparse解析自定义URI(Python)

u0b*_*6ae 13 python url python-2.6 urlparse

我的应用程序创建自定义URI(或URL?)来标识对象并解决它们.问题是Python的urlparse模块拒绝解析未知的URL方案,就像解析http一样.

如果我不调整urlparse的uses_*列表,我得到这个:

>>> urlparse.urlparse("qqqq://base/id#hint")
('qqqq', '', '//base/id#hint', '', '', '')
>>> urlparse.urlparse("http://base/id#hint")
('http', 'base', '/id', '', '', 'hint')
Run Code Online (Sandbox Code Playgroud)

这就是我的工作,我想知道是否有更好的方法:

import urlparse

SCHEME = "qqqq"

# One would hope that there was a better way to do this
urlparse.uses_netloc.append(SCHEME)
urlparse.uses_fragment.append(SCHEME)
Run Code Online (Sandbox Code Playgroud)

为什么没有更好的方法来做到这一点?

too*_*ose 23

您还可以使用urlparse注册自定义处理程序:

import urlparse

def register_scheme(scheme):
    for method in filter(lambda s: s.startswith('uses_'), dir(urlparse)):
        getattr(urlparse, method).append(scheme)

register_scheme('moose')
Run Code Online (Sandbox Code Playgroud)

这会将您的网址方案附加到列表中:

uses_fragment
uses_netloc
uses_params
uses_query
uses_relative
Run Code Online (Sandbox Code Playgroud)

然后将uri视为类似http,并将正确返回路径,片段,用户名/密码等.

urlparse.urlparse('moose://username:password@hostname:port/path?query=value#fragment')._asdict()
=> {'fragment': 'fragment', 'netloc': 'username:password@hostname:port', 'params': '', 'query': 'query=value', 'path': '/path', 'scheme': 'moose'}
Run Code Online (Sandbox Code Playgroud)

  • 好的,修复了示例还包括查询字符串解析 (2认同)

Ned*_*der 3

我认为问题是 URI 在方案之后并不都有通用的格式。例如,mailto: url 的结构与 http: url 不同。

我将使用第一次解析的结果,然后合成一个 http url 并再次解析它:

parts = urlparse.urlparse("qqqq://base/id#hint")
fake_url = "http:" + parts[2]
parts2 = urlparse.urlparse(fake_url)
Run Code Online (Sandbox Code Playgroud)