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

HTML 원문의 &와 주소의 &를 두 종이와 돋보기로 비교하는 삽화, 링크의 & 원문과 주소 구분 제목

블로그 HTML에서 복사한 주소에 &가 보인다고 곧바로 잘못된 링크라고 판단하지 마세요. HTML 원문에는 문자 참조로 적혀 있고, HTML 파서가 읽은 속성값에서는 실제 &가 될 수 있습니다.

원문을 보고 있는지, 이미 파싱한 href를 보고 있는지부터 구분하면 중복 변환과 쿼리 키 오류를 찾기 쉽습니다. 아래 예시는 실제 사이트를 수집하지 않는 작은 문자열 실험입니다.

1. HTML 원문의 &는 문자 참조

MDN은 HTML 문자 참조를 웹페이지에 다른 문자를 나타내기 위한 표기로 설명하며, &가 &에 대응함을 안내합니다. 주소의 쿼리 구분자와 HTML 안에서 그 문자를 적는 표기를 같은 문자열 단계로 취급하지 않는 것이 핵심입니다. MDN 문자 참조 안내

HTML 원문 예:
<a href="https://example.com/?a=1&amp;b=2">예시</a>

HTML 파서가 읽은 href:
https://example.com/?a=1&b=2

주소를 새 HTML 속성에 넣는 단계와, URL 자체의 쿼리를 분석하는 단계도 나눠 두세요. 파일에 저장된 문자열을 설명 없이 모두 ‘URL’이라고 부르면 어떤 변환이 이미 적용됐는지 알기 어려워집니다.

2. HTMLParser로 속성값을 읽는 작은 예시

Python 공식 문서에 따르면 handle_starttag에 전달되는 속성값에서는 문자·엔터티 참조가 치환됩니다. 다음은 독립적으로 만든 예시입니다. 네트워크에 요청하거나 글을 변경하지 않고, 문자열 속 href 하나만 읽습니다. Python HTMLParser 속성값 안내

from html.parser import HTMLParser

class LinkReader(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag == 'a':
            print(dict(attrs).get('href'))

sample = '<a href="https://example.com/?a=1&amp;b=2">예시</a>'
LinkReader().feed(sample)

# 출력
# https://example.com/?a=1&b=2

이 예시의 example.com은 설명용 주소입니다. 정상 접속이나 자료 존재를 확인하는 코드는 아닙니다. 실제 실험에서는 추출값의 쿼리를 읽었을 때 a와 b가 각각 키로 나오는 것도 확인했습니다.

3. 추출 뒤 다시 바꾸기 전에 남길 기록

단계보존할 값확인할 점
입력원본 HTML의 해당 부분문자 참조로 적혀 있었는가
파싱파서가 반환한 href이미 &로 변환됐는가
분석쿼리의 키·값 목록b 대신 amp;b 같은 키가 생기지는 않았는가
공개 확인실제 클릭한 최종 주소원하는 상세 내용으로 열리는가

이 표는 링크 점검용 제안입니다. 파서가 반환한 문자열에 일괄적으로 ‘한 번 더 변환’을 적용하기보다, 현재 단계의 입력과 출력을 먼저 비교하세요. 원래 데이터에 문자 참조처럼 보이는 텍스트가 포함된 경우까지 같은 방식으로 처리하면 의미가 달라질 수 있습니다.

또 HTML 문자 참조 처리와 URL의 퍼센트 인코딩 처리는 목적이 다릅니다. &amp;를 보았다는 이유만으로 URL 전체에 디코딩 함수를 반복 적용하지 마세요. 먼저 HTML 속성값을 얻고, 그다음 필요한 URL 분석을 하는 흐름으로 기록하는 편이 추적하기 쉽습니다.

4. 자주 묻는 질문

원문에 &amp;가 있으면 전부 &로 치환하면 되나요?

원본이 HTML인지, 이미 추출된 주소인지부터 확인하세요. HTML 파서가 처리한 값이라면 같은 작업을 반복할 이유가 있는지 점검해야 합니다.

추출한 href가 맞으면 링크 점검이 끝나나요?

추출 결과 확인과 실제 공개 목적지 확인은 별개입니다. 로그인 필요 여부, 최종 주소와 내용도 필요에 맞게 확인하세요.

이 예시가 모든 HTML 링크를 수집하나요?

아닙니다. a 태그의 href 처리를 보여 주는 작은 예시이며, 상대 주소 해결·중복 제거·페이지 이동이나 자바스크립트 동작 분석은 포함하지 않습니다.

Python 공식 HTML 속성값 처리 설명 보기

확인일: 2026년 10월 11일. 문법 근거는 MDN과 Python 공식 문서이며, 예시 코드와 기록표는 독립적으로 구성했습니다.

대표 이미지는 이해를 돕기 위해 AI로 제작했습니다.

이 블로그의 인기 게시물

디노 블로그 링크 추출기

디노 글자수 계산기