URLの最後のスラッシュの後にすべてを取得する方法は?


110

PythonでURLの最後のスラッシュに続くものを抽出するにはどうすればよいですか?たとえば、これらのURLは次を返す必要があります。

URL: http://www.test.com/TEST1
returns: TEST1

URL: http://www.test.com/page/TEST2
returns: TEST2

URL: http://www.test.com/page/page/12345
returns: 12345

私はurlparseを試しましたが、のようなフルパスのファイル名が得られpage/page/12345ます。


1
URLになどのクエリ文字列が含まれている可能性があり、これが不要な...?foo=bar場合。urlparsenaegのbasename-suggestion と組み合わせて使用することをお勧めします。
plundra 2011

回答:


243

特別なことは必要ありません。標準ライブラリの文字列メソッドを見るだけで、URLを 'filename'の部分と残りの部分に簡単に分割できます。

url.rsplit('/', 1)

だからあなたは単にあなたが興味のある部分を手に入れることができます:

url.rsplit('/', 1)[-1]

10
url.rsplit('/', 1)リストを返しurl.rsplit('/', 1)[-1]、最後のスラッシュの後のビットです。
Hugo

5
行う別の方法は次のようになります。url.rsplit(「/」、1)().pop
アレックス・フォルタン

警告:この基本的なトリックは、などのURLでは完全に機能しませんhttp://www.example.com/foo/?entry=the/bar#another/bar。ただしrsplit、クエリやフラグメントパラメータにスラッシュが絶対にないことが確実である場合は、などの基本的な解析で問題ありません。しかし、実際にこのrsplitコードが含まれているコードベースの数と、それに関連するクエリ処理のバグを考えると、身震いします。絶対的なセキュリティと信頼性を求める人は、urllib.parse()代わりに使用すべきです!次にpath、それが返す値を使用してTHATを分割し、パスのみを分割したことを確認できます。
ミッチマクマーズ

コード:より良い方法を実装する方法の例: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1])結果:foo.htm
Mitch McMabers



10

あなたはこのようにすることができます:

head, tail = os.path.split(url)

テールはファイル名になります。


6

urlparseは、必要に応じて使用するのに適しています(たとえば、クエリ文字列パラメーターをすべて削除するため)。

import urllib.parse

urls = [
    'http://www.test.com/TEST1',
    'http://www.test.com/page/TEST2',
    'http://www.test.com/page/page/12345',
    'http://www.test.com/page/page/12345?abc=123'
]

for i in urls:
    url_parts = urllib.parse.urlparse(i)
    path_parts = url_parts[2].rpartition('/')
    print('URL: {}\nreturns: {}\n'.format(i, path_parts[2]))

出力:

URL: http://www.test.com/TEST1
returns: TEST1

URL: http://www.test.com/page/TEST2
returns: TEST2

URL: http://www.test.com/page/page/12345
returns: 12345

URL: http://www.test.com/page/page/12345?abc=123
returns: 12345

5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD

これも動作します:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
アレックスGlukhovtsev

3

これは、これを行うより一般的な正規表現の方法です。

    re.sub(r'^.+/([^/]+)$', r'\1', url)

少し説明してもらえますか?
モニカ


0

partitionそしてrpartition、そのようなものにも便利です:

url.rpartition('/')[2]


-1
url ='http://www.test.com/page/TEST2'.split('/')[4]
print url

出力:TEST2


2
実際には-1インデックスとして渡す必要があります。そうでない場合、これは正確にその数の文字列でのみ機能します/
Chris_Rands
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.