2009-09-13 14 views
13

Moja aplikacja tworzy niestandardowe identyfikatory URI (lub adresy URL?) Do identyfikowania obiektów i ich rozwiązywania. Problem polega na tym, że moduł urlparse Pythona odmawia analizowania nieznanych schematów URL, tak jak parsuje http.Analizowanie niestandardowych identyfikatorów URI za pomocą urlparse (Python)

Jeśli nie regulować urlparse za uses_ * list uzyskać to:

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

Oto, co robię, i zastanawiam się, czy istnieje lepszy sposób to zrobić:

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) 

Dlaczego nie ma lepszego sposobu na zrobienie tego?

+0

urlparse również ma inny param, nie mówię, że to nie robi żadnej różnicy. (Przykład: 'urlparse.urlparse (" qqqq: // base/id # hint "," http ")' – u0b34a0f6ae

+0

Wierzę, że to pytanie (lub jego odpowiedzi, w zależności od tego jak na to patrzysz) [jest nieaktualne] (http : //stackoverflow.com/a/34902870/476716). – OrangeDog

Odpowiedz

3

Myślę, że problem polega na tym, że identyfikatory URI nie mają wspólnego formatu po schemacie. Na przykład adresy URL mailto: nie mają takiej samej struktury jak http: urls.

chciałbym wykorzystać wyniki pierwszej parse, a następnie syntetyzuje URL http i przetwarza go ponownie:

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

Poruszyłem moje własne obejście tego: musiałbym robić to cały czas w moim niestandardowym module URL: – u0b34a0f6ae

+0

Wystarczająco uczciwe: nie lubiłem polegać na wewnętrznych modułach, ale rozsądni inżynierowie mogą się różnić! –

1

Spróbuj całkowicie usuwając schemat i rozpocząć z // netloc, tj:

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

Nie będziesz mieć programu w wynikach urlparse, ale i tak znasz ten schemat.

Należy również pamiętać, że Python 2.6 wydaje się obsługiwać ten link w porządku (oprócz fragmentu):

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

Można również zarejestrować obsługi niestandardowej z 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') 

To doda Twój schemat URL do list:

uses_fragment 
uses_netloc 
uses_params 
uses_query 
uses_relative 

URI zostaną następnie traktowane jako http-like i będzie poprawnie powrócić ścieżki, fragment, login/hasło itd

urlparse.urlparse('moose://username:[email protected]:port/path?query=value#fragment')._asdict() 
=> {'fragment': 'fragment', 'netloc': 'username:[email protected]:port', 'params': '', 'query': 'query=value', 'path': '/path', 'scheme': 'moose'} 
+0

Jednak zapytanie nadal nie jest prawidłowo przetwarzane ... Dzięki. –

+2

ok, poprawiono przykład, aby zawierało również zapytanie o parsowanie ciągu znaków – toothygoose

+0

Nie udało się przejąć więcej niż raz :(Dzięki! –

3

Jest też biblioteka nazywa furl który daje spowodować chcesz:

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

Można użyć yurl bibliotekę. W przeciwieństwie do purl lub furl, nie próbuj naprawiać błędów urlparse. Jest nowy kompatybilny z implementacją RFC 3986.

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

Pytanie wydaje się być nieaktualne. Od co najmniej Python 2.7 nie ma problemów.

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

Chciałem to jeszcze bardziej zintensyfikować, na dzień 24.06.2016 r., a także analizuje spoza zasad przedstawionych powyżej: 'weird_scheme = 'qqq: // nazwa_użytkownika: hasł[email protected]/some/ ścieżka? params = klucz # frag_ment''. Następnie przeanalizuj i pokaż nazwę użytkownika: 'urlparse (weird_scheme) .username # 'username'' lub pokaż zapytanie: ' urlparse (weird_scheme) .query) # 'params = key'' – knickum

Powiązane problemy