백엔드

[파이썬] Python에서 URL 다루기 — urllib.parse 실전 가이드

정보덕 2025. 11. 7. 23:05
반응형

웹 개발을 하다 보면 URL을 직접 조작해야 하는 경우가 자주 생긴다.
API 요청을 만들거나, 파라미터를 추가하거나, 특정 경로만 추출해야 할 때가 그렇다.
파이썬에서는 이런 작업을 표준 라이브러리인 urllib.parse를 이용해 비교적 쉽게 처리할 수 있다.

이 글에서는 urllib.parse의 주요 기능을 중심으로, URL을 분해하고 수정하고 다시 조합하는 과정을 단계별로 살펴본다.

 

urllib.parse란?

urllib.parse는 URL 문자열을 구성 요소별로 분리하거나, 반대로 다시 합치는 기능을 제공한다.
별도의 외부 라이브러리 없이 표준 라이브러리만으로 URL 파싱, 인코딩, 쿼리 조작을 모두 처리할 수 있다.

 

Python 2의 urlparse 모듈이 Python 3에서 urllib.parse로 통합되었다.

 

 

URL을 분해하기 — urlparse

urlparse() 함수는 URL을 6개의 요소로 분해한다. 반환값은 ParseResult 객체이며, 다음과 같은 속성을 가진다.

  • scheme: 프로토콜 (http, https, 등)
  • netloc: 도메인과 포트
  • path: 경로
  • params: 추가 매개변수 (거의 사용되지 않음)
  • query: 쿼리 스트링
  • fragment: 해시 프래그먼트
 
from urllib.parse import urlparse

parsed = urlparse('https://velog.io/tags/?sort=name')

print(parsed.scheme)    # https
print(parsed.netloc)    # velog.io
print(parsed.path)      # /tags/
print(parsed.query)     # sort=name

 

URL 재조합하기 — urlunparse

URL을 다시 문자열로 만들고 싶다면 urlunparse() 또는 ParseResult.geturl()을 사용하면 된다.

 
from urllib.parse import ParseResult, urlunparse

url = ParseResult(
    scheme='https',
    netloc='velog.io',
    path='/tags',
    params='',
    query='',
    fragment=''
)

print(url.geturl())     # https://velog.io/tags
print(urlunparse(url))  # https://velog.io/tags

Query String 분석 — parse_qs, parse_qsl

URL의 쿼리 스트링을 다루려면 parse_qs()와 parse_qsl() 함수를 사용할 수 있다.

from urllib.parse import urlparse, parse_qs, parse_qsl

parts = urlparse('https://velog.io/tags?sort=name&keyword=planb')

print(parse_qs(parts.query))
# {'sort': ['name'], 'keyword': ['planb']}

print(parse_qsl(parts.query))
# [('sort', 'name'), ('keyword', 'planb')]
  • parse_qs → value가 항상 리스트로 반환 (key 중복 가능)
  • parse_qsl → key-value 쌍의 리스트 형태로 반환

parse_qs는  쿼리 문자열에서 같은 key가 여러 번 등장할 수 있다. 그러면 해당 키를 하나로 보고, 값을 하나의 리스트로 병합한다.

parts = urlparse('https://velog.io/tags?keyword=planb&keyword=python')
print(parse_qs(parts.query))
# {'keyword': ['planb', 'python']}

 

 Query 수정 및 URL 재조합

쿼리 문자열을 수정하고 싶다면, 다음 순서를 따르면 된다.

  1. parse_qsl()로 key-value 쌍을 튜플로 가져오기
  2. dict()로 변환 후 수정
  3. urlencode()로 다시 문자열화
  4. _replace()로 교체 후 urlunparse()로 재조합
from urllib.parse import urlparse, parse_qsl, urlencode, urlunparse

parts = urlparse('https://velog.io/tags?sort=name&keyword=planb')
qs = dict(parse_qsl(parts.query))

qs['keyword'] = 'new'  # 수정
new_query = urlencode(qs)
parts = parts._replace(query=new_query)

print(urlunparse(parts))
# https://velog.io/tags?sort=name&keyword=new
 

 정리

URL 분해 urlparse() URL을 구조별로 분해
URL 재조합 urlunparse() 구조체를 다시 문자열로 변환
쿼리 파싱 parse_qs(), parse_qsl() 쿼리 문자열 → 딕셔너리/리스트
쿼리 재구성 urlencode() 딕셔너리 → 쿼리 문자열
구조 수정 _replace() 불변 객체 속성 변경용 메서드

 

마무리/요약

urllib.parse는 기본 제공 도구치고 꽤 강력하다. 단순히 문자열을 다루는 대신, 구조화된 데이터로 URL을 조작할 수 있어 유지보수가 쉽다.

 

다만 URL 구조를 더 직관적으로 다루고 싶다면, yarl, furl, requests 등 고수준 URL 라이브러리를 검토하는 것도 좋은 선택이다.

 

urllib.parse는 표준적이지만 다소 장황하기 때문에, 코드 가독성 면에서 외부 라이브러리가 도움이 될 수 있다.

 

<요약>

  • urllib.parse는 파이썬 표준 URL 처리 모듈
  • urlparse()로 분해, urlunparse()로 재조립
  • parse_qs / parse_qsl로 쿼리 파싱
  • _replace()와 urlencode()를 조합해 안전하게 수정
반응형