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

두 개의 URL이 있습니다.

url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"

url2에 대한 절대 URL을 어떻게 얻을 수 있습니까?



답변

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'


답변

상대 경로가 여러 부분으로 구성되어있는 경우 상대 경로를 결합하는 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을 생성 할 때 경로의 구성 요소를 결합하는 방법


답변

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


답변

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

단순한.


답변

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

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


답변

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에 대해 언급 한 것을 알 수 있습니다. 그러나 나는 이것이 어떻게 수행되는지 보여주기 위해 여기에 남겨 둘 것입니다.


답변