urllib.parse 모듈이란?
urllib.parse 모듈은 URL(Uniform Resource Locator) 문자열을 여러 구성 요소로 분해하거나, 반대로 분해된 구성 요소들을 다시 하나의 URL 문자열로 결합하는 표준 인터페이스를 제공합니다. 또한 '기본 URL(base URL)'이 주어졌을 때 '상대 URL(relative URL)'을 절대 URL(absolute URL)로 변환하는 기능도 함께 제공합니다.
이 모듈은 다음과 같은 다양한 URL 스킴(scheme)을 지원합니다.
- file
- ftp
- gopher
- hdl
- http
- https
- imap
- mailto
- mms
- news
- nntp
- prospero
- rsync
- rtsp
- rtspu
- sftp
- shttp
- sip
- sips
- snews
- svn
- svn+ssh
- telnet
- wais
- ws
- wss
urlparse() — URL을 6개 구성 요소로 분해
urlparse() 함수는 URL을 여섯 개의 구성 요소로 나누어 6-튜플(6-tuple) 형태로 반환합니다. 반환되는 각 튜플 항목은 문자열이며, 일반적인 URL 구조에 대응됩니다. 단, 각 구성 요소는 더 작은 단위로 세분화되지 않으며(예: 네트워크 위치는 하나의 문자열), % 이스케이프도 확장되지 않습니다.
반환값은 튜플을 상속한 서브클래스의 인스턴스로, 다음과 같은 속성을 가집니다.
| 속성 | 인덱스 | 값 | 값이 없을 경우 |
|---|---|---|---|
| scheme | 0 | URL 스킴 식별자 | scheme 매개변수 값 |
| netloc | 1 | 네트워크 위치 부분 | 빈 문자열 |
| path | 2 | 계층적 경로 | 빈 문자열 |
| params | 3 | 마지막 경로 요소의 매개변수 | 빈 문자열 |
| query | 4 | 쿼리 구성 요소 | 빈 문자열 |
| fragment | 5 | 프래그먼트 식별자 | 빈 문자열 |
| username | - | 사용자 이름 | None |
| password | - | 비밀번호 | None |
| hostname | - | 호스트 이름 (소문자) | None |
| port | - | 포트 번호 (정수) | None |
urlparse() 사용 예제
>>> from urllib.parse import urlparse
>>> url = 'https://mail.google.com/mail/u/0/?tab=rm#inbox'
>>> t = urlparse(url)
ParseResult(scheme='https', netloc='mail.google.com', path='/mail/u/0/', params='', query='tab=rm', fragment='inbox')
urlunparse() — 구성 요소를 다시 URL로 결합
urlunparse() 함수는 urlparse()가 반환한 튜플로부터 URL을 다시 생성합니다. parts 인자는 여섯 개의 항목을 가진 어떤 이터러블(iterable)이든 사용할 수 있습니다.
>>> from urllib.parse import urlunparse
>>> urlunparse(t)
'https://mail.google.com/mail/u/0/?tab=rm#inbox'
urlsplit() — params를 제외한 5개 요소로 분해
urlsplit() 함수는 urlparse()와 유사하지만, URL에서 params를 별도로 분리하지 않는다는 차이점이 있습니다. 이 함수는 다섯 개의 요소를 가진 5-튜플을 반환합니다: (스킴, 네트워크 위치, 경로, 쿼리, 프래그먼트 식별자).
>>> from urllib.parse import urlsplit
>>> urlsplit(url)
SplitResult(scheme='https', netloc='mail.google.com', path='/mail/u/0/', query='tab=rm', fragment='inbox')
urlunsplit() — 분해된 요소를 하나의 URL로 통합
urlunsplit() 함수는 urlsplit()이 반환한 튜플의 요소들을 결합하여 하나의 완전한 URL 문자열로 만들어 줍니다.
URL 인용(Quoting) 함수
URL 인용 관련 함수들은 프로그램 데이터를 안전하게 URL 구성 요소로 사용할 수 있도록 특수 문자를 인용 처리하고, 비 ASCII(non-ASCII) 텍스트를 적절히 인코딩하는 데 중점을 둡니다.
quote()
quote() 함수는 문자열 내의 특수 문자를 %xx 이스케이프 형식으로 대체합니다. 단, 영문자, 숫자, 그리고 '_.-~' 문자는 절대 인용되지 않습니다.
>>> from urllib.parse import quote
>>> q = quote(url)
'https%3A//mail.google.com/mail/u/0/%3Ftab%3Drm%23inbox'
quote_plus()
quote_plus()는 quote()와 동일하게 동작하지만, 공백을 덧셈 기호(+)로 대체한다는 점이 다릅니다. 이는 URL에 포함될 쿼리 문자열을 만들 때 HTML 폼(form) 값을 인용하는 데 필요한 방식입니다.
unquote()
unquote() 함수는 %xx 이스케이프를 해당하는 단일 문자로 되돌려 변환합니다. 즉, 인코딩된 URL을 원래 상태로 복원하는 디코딩 역할을 수행합니다.
>>> from urllib.parse import unquote
>>> unquote(q)
'https://mail.google.com/mail/u/0/?tab=rm#inbox'
urlencode() — 딕셔너리를 쿼리 문자열로 변환
urlencode() 함수는 매핑 객체(mapping object) 또는 두 요소로 이루어진 튜플의 시퀀스를 퍼센트 인코딩된 ASCII 텍스트 문자열로 변환합니다. 결과 문자열은 '&' 문자로 구분된 일련의 key=value 쌍으로 구성되며, 주로 GET 요청의 쿼리 문자열을 생성할 때 활용됩니다.
>>> from urllib.parse import urlencode
>>> qry = {"name": "Rajeev", "salary": 20000}
>>> urlencode(qry)
'name=Rajeev&salary=20000'