URL에서 마지막 슬래시 뒤의 모든 것을 얻는 방법은 무엇입니까?


110

파이썬에서 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.
plundra

답변:


243

멋진 것은 필요하지 않습니다 . 표준 라이브러리의 문자열 메서드를 참조 하면 'filename'부분과 나머지 부분으로 URL을 쉽게 분할 할 수 있습니다.

url.rsplit('/', 1)

따라서 다음과 같이 간단하게 관심있는 부분을 얻을 수 있습니다.

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

10
url.rsplit('/', 1)목록을 반환 url.rsplit('/', 1)[-1]하고 마지막 슬래시 뒤의 비트입니다.
Hugo

5
또 다른 방법은 다음과 같습니다. url.rsplit ( '/', 1) .pop ()
Alex Fortin

경고 : 이 기본 트릭은 http://www.example.com/foo/?entry=the/bar#another/bar. 그러나 rsplit쿼리 나 조각 매개 변수에 슬래시가 전혀 없다는 것이 절대적으로 확실하다면 기본적인 구문 분석 은 괜찮습니다. 그러나 실제로 얼마나 많은 코드베이스에이 rsplit코드와 쿼리 처리와 관련된 버그가 포함되어 있는지 생각하면 떨립니다 . 절대적인 보안과 신뢰성을 원하는 사람들은 urllib.parse()대신 사용해야합니다 ! 그런 다음 path반환 되는 값 을 사용하고 해당 값을 분할하여 경로 만 분할했는지 확인할 수 있습니다.
Mitch McMabers

코드 : 더 나은 방법을 구현하는 방법의 예 : 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)

tail은 파일 이름입니다.


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}")
Alex Glukhovtsev


2
extracted_url = url[url.rfind("/")+1:];

잊으 셨나요 from string import rfind답변에서
Kimvais

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.