解析自定义的URI与里urlparse(Python)的(Parse custom URIs wit

2019-07-17 21:10发布

我的应用程序创建自定义的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')

以下是我做的,我不知道是否有更好的方式来做到这一点:

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)

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

Answer 1:

我认为这个问题是URI的并不都具有该计划后的通用格式。 例如,至mailto:URL不构成相同为http:网址。

我会用第一解析的结果,然后合成一个http url和再次对其进行分析:

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


Answer 2:

您也可以注册一个里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'}


Answer 3:

还有图书馆称为收拢 ,让你得到你想要的:

>>>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'


Answer 4:

这个问题似乎是过时的。 因为至少Python 2.7版没有任何问题。

Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
>>> import urlparse
>>> urlparse.urlparse("qqqq://base/id#hint")
ParseResult(scheme='qqqq', netloc='base', path='/id', params='', query='', fragment='hint')


Answer 5:

尝试彻底消除了计划,并通过// netloc,即开始:

>>> SCHEME="qqqq"
>>> url="qqqq://base/id#hint"[len(SCHEME)+1:]
>>> url
'//base/id#hint'
>>> urlparse.urlparse(url)
('', 'base', '/id', '', '', 'hint')

你不会在结果里urlparse的方案,但你知道反正方案。

还要注意的是Python 2.6中似乎处理这个网址就好了(除了片段):

$ python2.6 -c 'import urlparse; print urlparse.urlparse("qqqq://base/id#hint")'
ParseResult(scheme='qqqq', netloc='base', path='/id#hint', params='', query='', fragment='')


Answer 6:

您可以使用yurl库。 不像金银丝或卷起,它不尝试修复的bug里urlparse。 它与RFC 3986实现新的兼容。

>>> import yurl
>>> yurl.URL('qqqq://base/id#hint')
URLBase(scheme='qqqq', userinfo=u'', host='base', port='', path='/id', query='', fragment='hint')


文章来源: Parse custom URIs with urlparse (Python)