La meilleure option est d'utiliser le posixpath
lorsque vous travaillez avec le composant "chemin" des URL. Ce module a la même interface que os.path
et fonctionne de manière cohérente sur les chemins POSIX lorsqu'il est utilisé sur des plateformes basées sur POSIX et Windows NT.
Code échantillon :
#!/usr/bin/env python3
import urllib.parse
import sys
import posixpath
import ntpath
import json
def path_parse( path_string, *, normalize = True, module = posixpath ):
result = []
if normalize:
tmp = module.normpath( path_string )
else:
tmp = path_string
while tmp != "/":
( tmp, item ) = module.split( tmp )
result.insert( 0, item )
return result
def dump_array( array ):
string = "[ "
for index, item in enumerate( array ):
if index > 0:
string += ", "
string += "\"{}\"".format( item )
string += " ]"
return string
def test_url( url, *, normalize = True, module = posixpath ):
url_parsed = urllib.parse.urlparse( url )
path_parsed = path_parse( urllib.parse.unquote( url_parsed.path ),
normalize=normalize, module=module )
sys.stdout.write( "{}\n --[n={},m={}]-->\n {}\n".format(
url, normalize, module.__name__, dump_array( path_parsed ) ) )
test_url( "http://eg.com/hithere/something/else" )
test_url( "http://eg.com/hithere/something/else/" )
test_url( "http://eg.com/hithere/something/else/", normalize = False )
test_url( "http://eg.com/hithere/../else" )
test_url( "http://eg.com/hithere/../else", normalize = False )
test_url( "http://eg.com/hithere/../../else" )
test_url( "http://eg.com/hithere/../../else", normalize = False )
test_url( "http://eg.com/hithere/something/./else" )
test_url( "http://eg.com/hithere/something/./else", normalize = False )
test_url( "http://eg.com/hithere/something/./else/./" )
test_url( "http://eg.com/hithere/something/./else/./", normalize = False )
test_url( "http://eg.com/see%5C/if%5C/this%5C/works", normalize = False )
test_url( "http://eg.com/see%5C/if%5C/this%5C/works", normalize = False,
module = ntpath )
Sortie du code :
http://eg.com/hithere/something/else
--[n=True,m=posixpath]-->
[ "hithere", "something", "else" ]
http://eg.com/hithere/something/else/
--[n=True,m=posixpath]-->
[ "hithere", "something", "else" ]
http://eg.com/hithere/something/else/
--[n=False,m=posixpath]-->
[ "hithere", "something", "else", "" ]
http://eg.com/hithere/../else
--[n=True,m=posixpath]-->
[ "else" ]
http://eg.com/hithere/../else
--[n=False,m=posixpath]-->
[ "hithere", "..", "else" ]
http://eg.com/hithere/../../else
--[n=True,m=posixpath]-->
[ "else" ]
http://eg.com/hithere/../../else
--[n=False,m=posixpath]-->
[ "hithere", "..", "..", "else" ]
http://eg.com/hithere/something/./else
--[n=True,m=posixpath]-->
[ "hithere", "something", "else" ]
http://eg.com/hithere/something/./else
--[n=False,m=posixpath]-->
[ "hithere", "something", ".", "else" ]
http://eg.com/hithere/something/./else/./
--[n=True,m=posixpath]-->
[ "hithere", "something", "else" ]
http://eg.com/hithere/something/./else/./
--[n=False,m=posixpath]-->
[ "hithere", "something", ".", "else", ".", "" ]
http://eg.com/see%5C/if%5C/this%5C/works
--[n=False,m=posixpath]-->
[ "see\", "if\", "this\", "works" ]
http://eg.com/see%5C/if%5C/this%5C/works
--[n=False,m=ntpath]-->
[ "see", "if", "this", "works" ]
Notes :
- Sur les plates-formes basées sur Windows NT
os.path
es ntpath
- Sur les plateformes basées sur Unix/Posix
os.path
es posixpath
-
ntpath
ne traitera pas les antislashs ( \
) correctement (voir les deux derniers cas dans le code/sortie) - ce qui est la raison pour laquelle posixpath
est recommandé.
- n'oubliez pas d'utiliser
urllib.parse.unquote
- envisager d'utiliser
posixpath.normpath
- La sémantique des séparateurs de chemins multiples (
/
) n'est pas défini par RFC 3986 . Cependant, posixpath
fusionne plusieurs séparateurs de chemins adjacents (c'est-à-dire qu'il traite ///
, //
y /
la même chose)
- Même si les chemins POSIX et URL ont une syntaxe et une sémantique similaires, ils ne sont pas identiques.
Références normatives :
2 votes
La syntaxe de l'URL est quelque chose comme :
scheme://domain:port/path?query_string#fragment_id
Donc, "hithere" est l'ensemble depath
dans le premier cas et 1 section de celui-ci dans le second. Il suffit de l'urlparser pour que 'hithere' devienne path.split('/')[1].1 votes
Ne serait-ce pas
path.split('/')[0]
? (le premier élément de la liste)2 votes
Non, car le chemin commence par un '/' et [0] est donc une chaîne vide. C'est-à-dire que ideone.com/hJRxk