인터넷 시대에 URL(Uniform Resource Locator)은 정보의 위치를 나타내는 기본적인 주소입니다. 웹 개발이나 데이터 분석 등 다양한 분야에서 URL을 다루게 되는데, 때로는 URL 전체가 아닌 특정 부분(예: 도메인, 경로, 쿼리 파라미터)만 추출하여 활용해야 할 필요가 있습니다. 이때 파이썬의 urllib.parse 모듈에 있는 urlparse() 함수가 강력한 도구로 사용됩니다.
이 글에서는 urlparse() 함수의 기본적인 사용법부터, 자주 사용되는 .netloc 속성의 의미와 활용 사례, 그리고 urlparse()가 반환하는 ParseResult 객체의 다양한 속성들을 자세히 알아보겠습니다.
1. urlparse() 란 무엇인가?
urlparse()는 URL 문자열을 RFC 1738(Universal Resource Locators in WWW) 및 RFC 3986(Uniform Resource Identifier (URI): Generic Syntax) 표준에 따라 여러 구성 요소로 분해하는 함수입니다. 이렇게 분해된 각 구성 요소는 ParseResult라는 이름의 특수 객체에 담겨 반환됩니다.
기본 사용법
urlparse() 함수는 urllib.parse 모듈에서 임포트하여 사용합니다.
from urllib.parse import urlparse
url = 'https://user:pass@www.example.com:8080/path/to/resource?name=Alice&age=30#section1'
parsed_url = urlparse(url)
print(parsed_url)
# 출력: ParseResult(scheme='https', netloc='user:pass@www.example.com:8080', path='/path/to/resource', params='', query='name=Alice&age=30', fragment='section1')
parsed_url 객체는 튜플처럼 인덱스로 접근할 수도 있고, 이름이 지정된 속성(named attribute)으로도 접근할 수 있습니다. 후자가 훨씬 가독성이 좋습니다.
2. ParseResult 객체의 주요 속성들
urlparse()가 반환하는 ParseResult 객체는 다음과 같은 속성들을 가집니다.
scheme
-
의미: URL의 프로토콜 부분을 나타냅니다. (
http,https,ftp,mailto등) -
예시:
'https'
netloc (네트워크 로케이션)
-
의미: 호스트명(도메인), 포트 번호, 그리고 선택적으로 사용자 인증 정보(
user:pass@)를 포함하는 부분입니다. -
예시:
'user:pass@www.example.com:8080' -
활용: 특정 웹 서비스의 도메인만 추출하거나, 포트 번호를 확인하여 네트워크 연결에 활용할 때 유용합니다. 뒤에서 더 자세히 다루겠습니다.
path
-
의미: 웹 서버 내의 특정 리소스 경로를 나타냅니다.
-
예시:
'/path/to/resource'
params (경로 파라미터)
-
의미: 세미콜론(
;)으로 구분되는 경로 파라미터입니다. RFC에 정의되어 있으나, 현대 웹에서는 거의 사용되지 않고 주로 쿼리(query)를 사용합니다. -
예시:
';sessionid=xyz'(드물게 사용됨)
query
-
의미: 물음표(
?) 뒤에 오는 쿼리 문자열입니다. 키-값 쌍의 형태로 데이터를 서버에 전달할 때 사용됩니다. -
예시:
'name=Alice&age=30' -
활용:
urllib.parse.parse_qs()함수와 함께 사용하면 딕셔너리 형태로 쉽게 파싱할 수 있습니다.
from urllib.parse import parse_qs
query_params = parse_qs(parsed_url.query)
print(query_params)
# 출력: {'name': ['Alice'], 'age': ['30']}
fragment
-
의미: 해시(
#) 뒤에 오는 프래그먼트 식별자입니다. 주로 웹 페이지 내의 특정 섹션으로 이동할 때 사용되며, 서버에는 전송되지 않고 브라우저에서만 처리됩니다. -
예시:
'section1'
3. .netloc 속성의 심층 분석
.netloc은 urlparse() 결과 중에서도 특히 중요한 속성입니다. netloc은 네트워크 로케이션(Network Location)의 약자이며, URL에서 웹 서버의 주소와 관련된 핵심 정보를 담고 있습니다.
netloc의 구성 요소
netloc은 다음과 같은 요소들로 구성될 수 있습니다.
-
사용자 정보 (Userinfo):
user:password@형태로 사용자 이름과 비밀번호가 포함될 수 있습니다. 보안상 일반적인 웹 URL에서는 거의 사용되지 않지만, FTP 같은 다른 프로토콜에서는 볼 수 있습니다. -
호스트 (Host): 도메인 이름 (
www.example.com) 또는 IP 주소 (192.168.1.1)입니다. -
포트 (Port):
:뒤에 붙는 포트 번호입니다. HTTP의 기본 포트 80, HTTPS의 기본 포트 443과 같이 기본 포트를 사용하는 경우netloc에는 포트 번호가 생략될 수 있습니다.
예시:
| URL | netloc 결과 | 설명 |
|---|---|---|
https://www.example.com |
www.example.com |
도메인만 포함 (HTTPS 기본 포트 443 생략) |
http://myhost:8000/app |
myhost:8000 |
호스트와 포트 포함 |
ftp://user:pass@ftp.example.org |
user:pass@ftp.example.org |
사용자 정보, 호스트 포함 |
.netloc를 활용하는 이유와 시나리오
-
도메인 추출 및 검증:
-
어떤 웹사이트에서 온 요청인지 확인하여 보안 정책을 적용하거나, 특정 도메인만 허용할 때
netloc을 통해 도메인 부분을 쉽게 추출할 수 있습니다. -
parsed_url.hostname속성을 사용하면netloc에서 포트 번호를 제외한 호스트명만 얻을 수 있습니다.
-
url = 'https://www.example.com:8080/path'
parsed = urlparse(url)
print(parsed.netloc) # 'www.example.com:8080'
print(parsed.hostname) # 'www.example.com'
print(parsed.port) # 8080 (int)
-
URL 재구성 또는 변경:
-
urlparse()로 분해된ParseResult객체는 불변(immutable)이지만,.replace()메서드를 사용하여 특정 속성만 변경한 새로운ParseResult객체를 만들 수 있습니다. 이렇게 변경된 객체를urlunparse()함수에 다시 전달하여 새로운 URL을 쉽게 재구성할 수 있습니다. -
예를 들어, 특정 도메인으로의 리다이렉션을 구현할 때
netloc만 변경하여 URL을 생성할 수 있습니다.
-
from urllib.parse import urlparse, urlunparse
original_url = 'https://old.example.com/data'
parsed_original = urlparse(original_url)
# 도메인만 변경하여 새로운 URL 생성
new_netloc = 'new.example.com'
modified_parsed = parsed_original._replace(netloc=new_netloc)
new_url = urlunparse(modified_parsed)
print(new_url) # 출력: https://new.example.com/data
-
URL의 동일성 비교 (도메인/포트 기준):
- 두 개의 URL이 같은 서버를 가리키는지 확인해야 할 때
netloc속성을 비교하는 것이 유용합니다.
- 두 개의 URL이 같은 서버를 가리키는지 확인해야 할 때
url1 = 'https://api.myapp.com/v1/users'
url2 = 'https://api.myapp.com:443/v2/products' # 443은 HTTPS 기본 포트
url3 = 'https://oldapi.myapp.com/v1/users'
parsed1 = urlparse(url1)
parsed2 = urlparse(url2)
parsed3 = urlparse(url3)
print(parsed1.netloc == parsed2.netloc) # True (기본 포트는 생략되어 동일하게 취급될 수 있음)
print(parsed1.hostname == parsed2.hostname) # True
print(parsed1.netloc == parsed3.netloc) # False
4. urlparse()와 urlsplit()의 차이점
urllib.parse 모듈에는 urlparse()와 매우 유사한 urlsplit() 함수도 있습니다. 두 함수의 주요 차이점은 params 속성을 처리하는 방식입니다.
-
urlparse():params속성을 별도로 분리합니다. -
urlsplit():params속성을path속성에 포함시켜 반환합니다.ParseResult대신SplitResult객체를 반환하며params속성이 없습니다.
현대 웹 개발에서는 params가 거의 사용되지 않으므로, 많은 경우 urlsplit()을 사용해도 무방합니다. 하지만 urlparse()가 더 일반적이고 완전한 구분을 제공합니다.
결론: URL 분석의 필수 도구
파이썬의 urlparse() 함수는 복잡한 URL 문자열을 체계적으로 분해하고, 필요한 부분만 추출하여 활용할 수 있게 해주는 강력한 도구입니다. 특히 .netloc 속성은 URL의 핵심인 호스트와 포트 정보를 제공하여, 도메인 기반의 로직 처리나 URL 재구성 시 매우 유용하게 사용됩니다.
웹 스크래핑, API 요청 처리, 보안 검증 등 URL을 다루는 모든 파이썬 개발자에게 urlparse()는 반드시 알아야 할 필수 지식입니다. 이 함수를 통해 URL 데이터를 더욱 효과적으로 제어하고 활용해 보시기 바랍니다.

댓글이 없습니다.