Question

Mon application crée des URI (ou URL) personnalisés pour identifier et résoudre les objets. Le problème est que le module urlparse de Python refuse d'analyser les schémas d'URL inconnus comme il analyse http.

Si je ne modifie pas les listes uses_ * de urlparse, je reçois ceci:

>>> urlparse.urlparse("qqqq://base/id#hint")
('qqqq', '', '//base/id#hint', '', '', '')
>>> urlparse.urlparse("http://base/id#hint")
('http', 'base', '/id', '', '', 'hint')

Voici ce que je fais et je me demande s’il existe un meilleur moyen de le faire:

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)

Pourquoi n'y a-t-il pas de meilleur moyen de le faire?

Était-ce utile?

La solution

Je pense que le problème est que les URI n’ont pas tous un format commun après le schéma. Par exemple, les URL mailto: ne sont pas structurées de la même manière que http: .

Je voudrais utiliser les résultats de la première analyse, puis synthétiser une URL http et l’analyser à nouveau:

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

Autres conseils

Vous pouvez également enregistrer un gestionnaire personnalisé avec 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')

Ceci ajoutera votre schéma d'URL aux listes:

uses_fragment
uses_netloc
uses_params
uses_query
uses_relative

L'URI sera alors traité comme du type http et renverra correctement le chemin d'accès, le fragment, le nom d'utilisateur / mot de passe, etc.

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

Il existe également une bibliothèque appelée furl qui vous donne le résultat souhaité:

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

La question semble être obsolète. Depuis au moins Python 2.7, il n’ya pas de problème.

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

Essayez de supprimer complètement le schéma et commencez par // netloc, c'est-à-dire:

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

Vous n'aurez pas le schéma dans le résultat urlparse, mais vous le connaissez quand même.

Notez également que Python 2.6 semble bien gérer cette URL (à part le fragment):

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

Vous pouvez utiliser la bibliothèque yurl . Contrairement à purl ou furl, il n’essaie pas de corriger les bugs urlparse. Il est compatible avec l’application RFC 3986.

>>> import yurl
>>> yurl.URL('qqqq://base/id#hint')
URLBase(scheme='qqqq', userinfo=u'', host='base', port='', path='/id', query='', fragment='hint')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top