Ho provato a utilizzare os.normpath
per convertire http://example.com/a/b/c/../
in http://example.com/a/b/
ma non funziona su Windows perché converte la barra in barra rovesciata.Come posso normalizzare/comprimere percorsi o URL in Python in modo indipendente dal SO?
risposta
Ecco come farlo
>>> import urlparse
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/", "../..")
'ftp://domain.com/a/b/'
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/e.txt", "../..")
'ftp://domain.com/a/b/'
Ricordate che urljoin
considerano un percorso/directory tutto fino all'ultimo /
- dopo questo è il nome del file, se presente.
Inoltre, non aggiungere uno /
leader al secondo parametro, altrimenti non si otterrà il risultato previsto.
os.path
modulo dipende dalla piattaforma ma per i percorsi dei file che utilizzano solo barre ma non URL è possibile utilizzare posixpath,normpath
.
adottato dal modulo os "- os.path è uno dei moduli posixpath, o ntpath", nel tuo caso esplicitamente utilizzando posixpath.
>>> import posixpath
>>> posixpath.normpath("https://stackoverflow.com/a/b/../c")
'/a/c'
>>>
'posixpath.normpath' fa cose inutili come rimuovere le barre finali e consentire la doppia barra iniziale. Sostituisce anche il percorso vuoto con '.'. –
Né urljoin
né posixpath.normpath
fare il lavoro correttamente. urljoin
ti costringe a unirti a qualcosa, e non gestisce correttamente i percorsi assoluti o eccessivi ..
. posixpath.normpath
elimina più barre e rimuove le barre finali, entrambe cose che gli URL non dovrebbero fare.
La seguente funzione risolve completamente URL, trattare sia .
s e ..
s, in modo corretto secondo RFC 3986.
try:
# Python 3
from urllib.parse import urlsplit, urlunsplit
except ImportError:
# Python 2
from urlparse import urlsplit, urlunsplit
def resolve_url(url):
parts = list(urlsplit(url))
segments = parts[2].split('/')
segments = [segment + '/' for segment in segments[:-1]] + [segments[-1]]
resolved = []
for segment in segments:
if segment in ('../', '..'):
if resolved[1:]:
resolved.pop()
elif segment not in ('./', '.'):
resolved.append(segment)
parts[2] = ''.join(resolved)
return urlunsplit(parts)
È quindi possibile chiamare su un URL completo come segue.
>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'
Per ulteriori informazioni sulle considerazioni che devono essere fatte durante la risoluzione degli URL, vedere a similar answer I wrote earlier on the subject.
- 1. PHP e SSL CA verifica - Indipendente dal SO
- 2. Come passare attraverso i thread Python in modo indipendente? (WinPDB)
- 3. .so percorsi di ricerca
- 4. Applicazione Yesod indipendente dal nome host
- 5. In Pacman i fantasmi scelgono i percorsi in modo indipendente per trovare pacman?
- 6. Come importare il modulo python dal file .so?
- 7. NSDate indipendente dal fuso orario?
- 8. Come risolvere i percorsi relativi in python?
- 9. Come generare un percorso indipendente dal sistema operativo in C++
- 10. Verifica percorsi assoluti in Python
- 11. Come posso controllare le zecche dell'asse ye le tacche dell'asse x in modo indipendente in ggplot2?
- 12. Correzione dei percorsi "../../" in python
- 13. Nuovo URL su admin di django indipendente dalle app
- 14. C'è un modo per determinare che una libreria .a o .so è stata compilata come codice indipendente dalla posizione?
- 15. Come leggere 'List separator' dal SO in Java?
- 16. Come posizionare due legende in modo indipendente in ggplot
- 17. Errori JavaScript Catch in Selenium WebDriver - Indipendente dal browser
- 18. C'è un modo intelligente per combinare percorsi sovrapposti in python?
- 19. come generare un nuovo processo indipendente in python
- 20. In Erlang, come posso acquisire in modo indipendente lo stdout e lo stderr di un sottoprocesso?
- 21. Forma divisa definita dal percorso in sotto-percorsi
- 22. Come posso reindirizzare in modo trasparente un'importazione Python?
- 23. Come posso unire due percorsi in C#?
- 24. Trasforma oggetti in modo indipendente in OpenGL ES 2.0
- 25. Come posso elaborare xml in modo asincrono in python?
- 26. Riferimento indipendente dal server in un tema XPages
- 27. Come escludere o ignorare percorsi speciali o instradamenti dal routing zuul
- 28. Codifica URL in python
- 29. impostazione URL di riferimento in python urllib.urlretrieve
- 30. Python: come posso ereditare dal tipo di lista built-in?
Al contrario: se il secondo parametro ha un prefisso '/', restituirà 'ftp: //domain.com /../ ..'. Correzione. –