상세 컨텐츠

본문 제목

[Python] 도로명 주소, 우편번호 찾기

Dev.Stroy/Web

by zNine 2025. 4. 4. 12:40

본문

728x90
반응형

문서를 OCR 하고, 파싱해서 추출된 주소 텍스트를 가지고 정확한 도로명주소, 우편번호를 얻어오는 코드.
주소기반산업지원서비스 API를 활용.
1. API 신청
아래 사이트에서 API 키를 신청한다.

https://business.juso.go.kr

주소정보누리집(도로명주소 안내시스템)

business.juso.go.kr

 
2. 코드 요구사항
텍스트에는  동/읍/면/리 또는 도로명 주소가 들어가 있을 수 있고,
상세주소(건물명, 아파트 동, 호수 등)가 같이 있을 수 있음.
리턴 값은 "도로명 주소", "우편번호"
 
3. 코드 구현

import os
import re
import requests
from dotenv import load_dotenv

# .env
load_dotenv()

# https://business.juso.go.kr/addrlink/openApi/apiReqst.do
JUSO_API_KEY = os.environ.get('JUSO_API_KEY')

# 주소 패턴
addr_pattern = r"^([가-힣]+[시도]?\s[가-힣]+[구군시]\s[가-힣0-9\-]+(?:[로길대로]|[읍면동리])\s?[0-9\-번지]*)\s?(.*)?"

# 텍스트에서 추출한 도로명 or 동/읍/면/리 주소를 검색 가능한 텍스트로 분리.
def extract_addr(addr):
    re_addr = re.sub(r"^\(.*?\)\s*", "", addr)
    re_addr = re.sub(r"[.,]", " ", re_addr)
    match = re.match(addr_pattern, re_addr)
    if match:
        road_address = match.group(1)  # 도로명 주소
        detailed_address = match.group(2) if match.group(2) else ""  # 상세 주소
        return road_address, detailed_address.strip()
    else:
        return addr, ""

# API 호출 함수
def api_resquest(addr):
    try:
        addr1, addr2 = extract_addr(addr)

        url = f"https://business.juso.go.kr/addrlink/addrLinkApi.do?confmKey={JUSO_API_KEY}&currentPage=1&countPerPage=10&keyword={addr1}&resultType=json"
        response = requests.get(url)
        
        data = response.json()
        if data['results']['common']['errorMessage'] == '정상' and len(data['results']['juso']) > 0:
            juso = data['results']['juso'][0]["roadAddrPart1"]
            zipno = data['results']['juso'][0]['zipNo']
            return f"{juso} {addr2}", zipno
        else:
            return addr, "-"
        
    except Exception as e:
        print(f"Exception occured in postal api_resquest: {e}")
        return addr, "-"

def get_road_addr_n_postcode(addr):
    return api_resquest(addr)
    
if __name__ == '__main__':
    import argparse    
    parser = argparse.ArgumentParser()
    parser.add_argument("-t", help="address", required=True)
    
    args = parser.parse_args()
    
    juso, zipno = get_road_addr_n_postcode(args.t)
    print(f"juso: {juso}, zip: {zipno}")

 

728x90
반응형

관련글 더보기