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

URL의 #뒤 옵션 하나로 해석이 달라질 때 제목과 노트북·검색값과 fragment를 나눈 주소 띠 삽화

urlparse에서 allow_fragments=False를 지정한다고 #뒤가 삭제되지는 않습니다. fragment로 인식하지 않은 내용은 경로·매개변수·쿼리의 일부로 남을 수 있습니다. 빈 fragment 칸만 보고 원문에도 #가 없었다고 판단하지 마세요.

1. False는 삭제가 아니라 인식 방식입니다

Python3.12 공식 문서는 allow_fragments가 거짓이면 fragment 식별자를 인식하지 않고 경로·매개변수·쿼리의 일부로 분해하며, 반환된 fragment는 빈 문자열이 된다고 설명합니다. “별도 칸으로 나누지 않는다”와 “문자열에서 제거한다”는 서로 다른 처리입니다.

Python allow_fragments 인수의 공식 정의 보기

2. 같은 주소를 두 옵션으로 비교하세요

원본: 처리 전 URL 문자열을 따로 보존 / 기본값True: #뒤를fragment로 인식 / False: fragment 칸은 비어도 내용은 남음 / 점검: path·query와옵션을 함께 비교

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'  ''
입력·옵션queryfragment 또는path
?topic=camp#fees / Truetopic=campfragment = fees
?topic=camp#fees / Falsetopic=camp#feesfragment = 빈 문자열
/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 개념 삽화이며 본문 구분 도표는 직접 구성했습니다.

이 블로그의 인기 게시물

디노 블로그 링크 추출기

디노 글자수 계산기

URL에 앰퍼샌드 표기가 남을 때: HTML 원문과 추출한 href를 구분하세요