13

私のアプリケーションは、オブジェクトを識別して解決するためのカスタム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)

なぜこれを行うためのより良い方法がないのですか?

4

6 に答える 6

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

これにより、URL スキームがリストに追加されます。

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'}
于 2011-06-07T11:00:59.977 に答える
3

問題は、URIがスキームの後ですべて共通のフォーマットを持っているわけではないということだと思います。たとえば、mailto:urlsはhttp:urlsと同じように構造化されていません。

最初の解析の結果を使用してから、http URLを合成して、再度解析します。

parts = urlparse.urlparse("qqqq://base/id#hint")
fake_url = "http:" + parts[2]
parts2 = urlparse.urlparse(fake_url)
于 2009-09-13T15:15:42.597 に答える
2

質問は古くなっているようです。少なくとも 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')
于 2016-01-20T14:33:49.647 に答える
1

スキームを完全に削除してみて、//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はこのURLを(フラグメントを除いて)問題なく処理しているように見えることにも注意してください。

$ python2.6 -c 'import urlparse; print urlparse.urlparse("qqqq://base/id#hint")'
ParseResult(scheme='qqqq', netloc='base', path='/id#hint', params='', query='', fragment='')
于 2011-02-05T13:33:25.900 に答える
0

yurlライブラリを使用できます。purl や furl とは異なり、urlparse のバグを修正しようとはしません。RFC 3986 実装との新しい互換性があります。

>>> import yurl
>>> yurl.URL('qqqq://base/id#hint')
URLBase(scheme='qqqq', userinfo=u'', host='base', port='', path='/id', query='', fragment='hint')
于 2013-12-25T15:35:22.957 に答える