os.normpathに変換するためhttp://example.com/a/b/c/../に使用しようとしましhttp://example.com/a/b/たが、スラッシュをバックスラッシュに変換するため、Windows では機能しません。
3 に答える
ここにそれを行う方法があります
>>> 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/'
urljoin最後までパス/ディレクトリを考慮することを忘れないでください/。これ以降はファイル名です。
また、2 番目のパラメーターに先頭/を追加しないでください。そうしないと、期待される結果が得られません。
os.pathモジュールはプラットフォームに依存しますが、ファイル パスにはスラッシュのみを使用し、URL は使用できませんposixpath,normpath。
仕事urljoinもposixpath.normpathちゃんとしない。urljoin何かに参加することを強制し、絶対パスまたは過剰な..s を正しく処理しません。posixpath.normpath複数のスラッシュを折りたたみ、末尾のスラッシュを削除します。どちらも URL で行うべきではありません。
次の関数は、URL を完全に解決し、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)
次に、次のように完全な URL で呼び出すことができます。
>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'
URL を解決する際に考慮する必要がある考慮事項の詳細については、この件に関して以前に書いた同様の回答を参照してください。
os モジュールから採用 - os.path はモジュール posixpath または ntpath の 1 つです。この場合、明示的に posixpath を使用します。
>>> import posixpath
>>> posixpath.normpath("/a/b/../c")
'/a/c'
>>>