Python 3.12 URL 재조합 뒤 끝의 ?가 사라질 때: 원본과 urlunsplit 결과 구분

Python 3.12에서 URL을 분해한 뒤 재조합하면 값 없는 쿼리 구분자 ?가 생략될 수 있습니다. 링크 추출기의 문자열이 달라졌다고 곧바로 값이 유실됐다고 판단하지 말고, 원본과 분해 결과·재조합 결과를 나눠 보세요.
1. 직접 실행한 빈 쿼리 예시
다음은 Python 3.12의 urllib.parse로 확인한 편집용 예시입니다. example.com은 설명을 위한 도메인이며 실제 글 링크가 아닙니다.
u = "https://example.com/guide?"parts = urlsplit(u)urlunsplit(parts) → https://example.com/guide

분해 결과의 다섯 부분은 https, example.com, /guide, 빈 query, 빈 fragment입니다. Python 3.12 문서는 비어 있는 쿼리 앞의 물음표 같은 불필요한 구분자가 있으면 재조합 결과가 조금 다르지만 동등한 URL이 될 수 있다고 설명합니다.
2. 빈 구분자와 값 있는 검색 조건 비교
| 원본 예시 | 재조합 결과 | 확인할 차이 |
|---|---|---|
| https://example.com/guide? | https://example.com/guide | 값 없는 쿼리 구분자 생략 |
| https://example.com/guide?q=notes | https://example.com/guide?q=notes | 값 있는 검색 조건 유지 |
| 추출한 실제 주소 | 변환한 실제 주소 | 원본·변환본을 별도 열에 보존 |
이 글은 빈 값이 있는 q= 항목을 파싱할 때의 옵션과도 구분됩니다. 여기서는 query 전체가 비어 있고 끝에 구분자만 있는 예시를 다룹니다. 쿼리 키와 값이 있었는지부터 확인해야 다른 문제의 해결법을 가져오지 않습니다.
목록에는 원본 주소, 사용한 함수와 Python 버전, 변환 결과를 남길 수 있습니다. 두 문자열이 달라졌다는 표시는 유용하지만 그 차이가 어떤 부분인지 설명하는 열도 있어야 재검토하기 쉽습니다.
3. 동등한 구문 설명과 실제 서비스 동작은 별도입니다
주소 재조합을 실제 목적지의 응답 검증으로 대신하지 마세요. 공개 글에서는 최종 이동 주소와 본문이 맞는지 따로 확인해야 합니다.
서명이나 만료 조건이 포함된 주소는 검수 편의만을 이유로 고쳐 저장하지 않습니다. 제공자가 준 주소가 필요한 맥락이면 원본을 유지하고 목적지의 정상 사용 방법을 따르세요. 문자열 정리는 모든 서비스에 대한 호환 보장이 아닙니다.
최신 Python 문서에는 버전에 따라 다른 옵션이 나타날 수 있습니다. 이 글의 실행 예시와 설명은 Python 3.12를 기준으로 합니다. 자신의 실행 버전과 같은 문서에서 함수의 인자를 확인한 뒤 적용하세요.
4. 자주 묻는 질문
끝 ?가 없어지면 검색 값이 삭제된 건가요?
원본 query에 실제 값이 있었는지 먼저 확인하세요. 이 예시는 query 전체가 비어 있습니다.
원본 주소를 변환 결과로 덮어써도 되나요?
목록 검수에서는 원본과 변환본을 함께 보존하는 편이 차이를 확인하기 쉽습니다. 실제 서비스 주소를 임의로 바꾸지 마세요.
출처: Python 3.12 documentation, urllib.parse.urlunsplit. 확인일: 2026년 10월 13일. 예시와 기록 양식은 독자의 조건을 확인하도록 직접 구성했습니다.
대표 삽화는 AI로 제작했으며 본문 설명 도표는 직접 구성했습니다.