使用urlparse解析自定义URI(Python)
我的应用程序创建了自定义的URI(或者说URL?)来识别对象并进行解析。问题是,Python的urlparse模块不支持解析像http那样的未知URL格式。
如果我不调整urlparse的uses_*列表,我会得到这个:
>>> urlparse.urlparse("qqqq://base/id#hint")
('qqqq', '', '//base/id#hint', '', '', '')
>>> urlparse.urlparse("http://base/id#hint")
('http', 'base', '/id', '', '', 'hint')
这是我目前的做法,我在想有没有更好的方法来实现这个:
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)
为什么没有更好的方法来做到这一点呢?
6 个回答
3
还有一个叫做 furl 的库,它可以帮你得到你想要的结果:
>>>import furl
>>>f=furl.furl("qqqq://base/id#hint");
>>>f.scheme
'qqqq'
>>> f.host
'base'
>>> f.path
Path('/id')
>>> f.path.segments
['id']
>>> f.fragment
Fragment('hint')
>>> f.fragmentstr
'hint'
22
你还可以用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')
这样做会把你的网址方案添加到列表中:
uses_fragment
uses_netloc
uses_params
uses_query
uses_relative
然后,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'}
3
我觉得问题在于,URI(统一资源标识符)在方案(比如http或mailto)之后并没有一个统一的格式。举个例子,mailto:的链接和http:的链接结构是不一样的。
我会先解析一次,然后根据第一次解析的结果,重新构造一个http的链接,再进行一次解析:
parts = urlparse.urlparse("qqqq://base/id#hint")
fake_url = "http:" + parts[2]
parts2 = urlparse.urlparse(fake_url)