Python 3.12 urlparse의 allow_fragments=False: #뒤를 지우는 옵션이 아닙니다

urlparse에서 allow_fragments=False를 지정한다고 #뒤가 삭제되지는 않습니다. fragment로 인식하지 않은 내용은 경로·매개변수·쿼리의 일부로 남을 수 있습니다. 빈 fragment 칸만 보고 원문에도 #가 없었다고 판단하지 마세요.
1. False는 삭제가 아니라 인식 방식입니다
Python3.12 공식 문서는 allow_fragments가 거짓이면 fragment 식별자를 인식하지 않고 경로·매개변수·쿼리의 일부로 분해하며, 반환된 fragment는 빈 문자열이 된다고 설명합니다. “별도 칸으로 나누지 않는다”와 “문자열에서 제거한다”는 서로 다른 처리입니다.
Python allow_fragments 인수의 공식 정의 보기
2. 같은 주소를 두 옵션으로 비교하세요

from urllib.parse import urlparse
raw = "https://example.org/read?topic=camp#fees"
for allow in (True, False):
parts = urlparse(raw, allow_fragments=allow)
print(allow, repr(parts.query), repr(parts.fragment))
# True 'topic=camp' 'fees'
# False 'topic=camp#fees' ''| 입력·옵션 | query | fragment 또는path |
|---|---|---|
| ?topic=camp#fees / True | topic=camp | fragment = fees |
| ?topic=camp#fees / False | topic=camp#fees | fragment = 빈 문자열 |
| /read#fees / False | 빈 문자열 | path = /read#fees |
예시는 실제 사이트에 접속하지 않고 문자열만 분해합니다. 쿼리가 있는 경우와 없는 경우를 나눠 보면 같은 #뒤 내용이 어느 칸에 남는지 확인하기 쉽습니다. 출력표를 URL의 실제 서버 응답이나 공개 여부 검사로 읽지 마세요.
3. 링크 목록에는 옵션도 남기세요
링크 추출 결과를 CSV나 표로 옮길 때 raw_url, allow_fragments, path, query, fragment처럼 칸을 나누어 남겨 보세요. 원본을 덮어쓰면 빈 fragment가 원문 특성인지 옵션의 결과인지 되짚기 어렵습니다.
중복 비교를 위해 #뒤를 별도로 제외하려는 목적이라면 그 정책을 명시적으로 정하고 원본 주소는 유지하세요. allow_fragments=False라는 설정 하나를 삭제 정책의 대용으로 쓰지 않는 것이 핵심입니다.
4. 자주 묻는 질문
fragment가 비어 있으면 원문에 #가 없다는 뜻인가요?
아닙니다. 위 False 예시처럼 원문에는 #가 있고 반환된 fragment만 비어 있을 수 있습니다. 원본과 다른 구성요소를 함께 확인하세요.
이 옵션으로 URL 유효성 검사도 끝나나요?
아닙니다. 문자열을 나누는 옵션입니다. 실제 목적지와 공개 내용 확인은 별도 작업입니다.
공식 원문 확인 2026.10.16: Python3.12 urllib.parse 공식 문서.
대표 썸네일은 AI 개념 삽화이며 본문 구분 도표는 직접 구성했습니다.