절대 및 상대 URL을 결합하는 방법은 무엇입니까?


답변:


213

urlparse.urljoin을 사용해야합니다 .

>>> import urlparse
>>> urlparse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

Python 3 ( urlparse가 urllib.parse로 이름이 바뀜 ) 에서는 다음같이 사용할있습니다 .

>>> import urllib.parse
>>> urllib.parse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

5
urljoin3 또는 모드 매개 변수와 함께 사용하는 방법 또는이를 위해 어떤 라이브러리를 권장합니까?
Mesut Tasci 2013

@mesuutt는 루프를 만들고 이전에 결합 된 URL로 각 부분을 결합하려고합니다.
Cédric Julien

2
@ CédricJulien : 선행 /이 있는 모든 경로 가 "재설정"되고 체계 + netloc + lasturl을 반환 하므로 간단한 루프가 작동하지 않습니다 .urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion 2013

urljoin을 사용하는 경우 문제가 있습니다. 예를 들어 urljoin('http://www.a.com/', '../../b/c.png'), 결과는 'http://www.a.com/../../b/c.png'아니지만, http://www.a.com/b/c.png. 그래서 얻을 수있는 방법이 http://www.a.com/b/c.png있습니까?
bigwind

1
Python 3 문서에 대한 링크는 Python 2 문서를 가리키며, 답변에서 업데이트해야합니다. docs.python.org/3.6/library/…
Harsh

8

상대 경로가 여러 부분으로 구성되어있는 경우 상대 경로를 결합하는 urljoin것이 아니라 대체 하므로 개별적 으로 결합해야합니다. 이를 수행하는 가장 쉬운 방법은 posixpath.

>>> import urllib.parse
>>> import posixpath
>>> url1 = "http://127.0.0.1"
>>> url2 = "test1"
>>> url3 = "test2"
>>> url4 = "test3"
>>> url5 = "test5.xml"
>>> url_path = posixpath.join(url2, url3, url4, url5)
>>> urllib.parse.urljoin(url1, url_path)
'http://127.0.0.1/test1/test2/test3/test5.xml'

참고 항목 : Python에서 URL을 생성 할 때 경로의 구성 요소를 결합하는 방법


7
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)

3
값 목록을 지원하는 좋은 방법입니다. 그러나 감소를 사용하여 부작용 ( "기본"변수)을 제거 할 수 있습니다. reduce(lambda a, b: urlparse.urljoin(a, b), es) 되는지도 list[n] - to -> list[n]A가 감소입니다list[n] - to -> a calculated value
피터 페론

4
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'

단순한.


3

파이썬 3.0+의 경우 URL을 결합하는 올바른 방법은 다음과 같습니다.

from urllib.parse import urljoin
urljoin('https://10.66.0.200/', '/api/org')
# output : 'https://10.66.0.200/api/org'

1

reduceShikhar의 방법을 더 깨끗한 방식으로 달성 하는 데 사용할 수 있습니다 .

>>> import urllib.parse
>>> from functools import reduce
>>> reduce(urllib.parse.urljoin, ["http://moc.com/", "path1/", "path2/", "path3/"])
'http://moc.com/path1/path2/path3/'

이 방법을 사용하면 각 조각에 선행 슬래시가없는 후행 슬래시가 있어야합니다 (결합되는 경로 조각임을 나타냄). 이것은 더 정확하고 유익 path1/하며 전체 경로 /path1/나 알 수없는 URI 경로 조각이 아니라 URI 경로 조각이며 path1둘 중 하나 일 수 있습니다 (전체 경로로 처리됨).

/부족한 조각 에 추가해야하는 경우 다음을 수행 할 수 있습니다.

uri = uri if uri.endswith("/") else f"{uri}/"

URI 확인에 대해 자세히 알아 보려면 Wikipedia 에 몇 가지 좋은 예가 있습니다.

최신 정보

Peter Perron이 Shikhar의 대답에 대해 reduce에 대해 언급 한 것을 알 수 있습니다. 그러나 나는 이것이 어떻게 수행되는지 보여주기 위해 여기에 남겨 둘 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.