나의 모두 기록

[Python] 한글 URL 인코딩 (+URL로 이미지 출력) 본문

정보/Python

[Python] 한글 URL 인코딩 (+URL로 이미지 출력)

나서뿌 2023. 5. 11. 16:38

OpenAPI를 요청하기 위해 URL을 만드는 과정에서 한글을 인코딩하지 않아 오류가 발생하였습니다.

 

이번 글에서는 Python에서 한글을 인코딩하는 방법과 추가로 URL로 이미지를 출력하는 방법에 대해 알아보도록 하겠습니다. 코드는 던전앤파이터 API를 예시로 작성하였습니다.

 

한글 URL 인코딩 방법

from urllib.request import urlopen

# API Key 지정
key = "API_KEY"

serverId = 'casillas'
characterName = '대연동짱주먹'

url = f'https://api.neople.co.kr/df/servers/{serverId}/characters?characterName={characterName}&apikey={key}'

result_html = urlopen(url).read()

이 코드를 실행하면 아래와 같은 오류가 발생합니다. "UnicodeEncodeError: 'ascii' codec can't encode characters in position 50-52: ordinal not in range(128)"

 

이는 일반적으로 URL에 한글 또는 특수문자와 같은 ASCII 이외의 문자가 포함되어 있을 때 발생합니다. URL은 ASCII 문자셋으로만 구성되어야 하며, 다른 문자들은 URL 인코딩을 통해 ASCII 문자로 변환되어야 합니다.

이러한 문제를 해결하기 위해서는 파이썬의 urllib 라이브러리를 사용하여 URL을 인코딩해야 합니다. urllib.parse 모듈의 quote() 함수를 사용하면 URL에 포함된 한글이나 특수문자를 인코딩할 수 있습니다.

from urllib.parse import quote
import json

characterName = quote(characterName)
url = f'https://api.neople.co.kr/df/servers/{serverId}/characters?characterName={characterName}&apikey={key}'

print(characterName, end='\n\n')
result_html = urlopen(url).read()
result_json = json.loads(result_html)
print(json.dumps(result_json, indent=4))

출력 결과

첫 번째 줄은 quote를 이용하여 인코딩한 결과이며, 이제 정상적으로 호출되는 모습을 확인할 수 있습니다.

print(json.dumps(result_json, indent=4, ensure_ascii=False))

출력 결과

또한 다음과 같이 json.dumps() 함수의 ensure_ascii 매개 변수를 False로 설정하면 출력할 때 유니코드 문자를 그대로 출력할 수 있습니다.

URL로 이미지를 출력하는 방법

이번 API에서는 characterId를 이용해 캐릭터 이미지를 출력할 수 있었습니다. 추가로 파이썬으로 URL에서 이미지를 가져와 주피터 노트북에서 출력하는 방법에 대해 간단하게 살펴보도록 하겠습니다.

import requests
from PIL import Image
from io import BytesIO
import IPython.display as display

characterId = result_json['rows'][0]['characterId']
zoom=1

url = f'https://img-api.neople.co.kr/df/servers/{serverId}/characters/{characterId}?zoom={zoom}'

response = requests.get(url)
image = Image.open(BytesIO(response.content))
display.display(image)

우선 이미지를 가져오기 위해 requests 라이브러리를 사용하며, 이미지를 처리하기 위해 PIL 라이브러리를 불러옵니다.

 

requests.get() 함수를 사용하여 지정된 URL에서 이미지 데이터를 가져옵니다. 그리고 PIL의 Image.open() 함수를 사용하여 이미지를 엽니다. 마지막으로 IPython.display 모듈의 display() 함수를 사용하여 이미지를 주피터 노트북에서 출력합니다.


오늘은 파이썬에서 한글 URL을 인코딩하는 방법과 URL로 이미지를 출력하는 방법에 대해 알아보았습니다.

 

글은 여기서 마치도록 하겠습니다. 읽어주셔서 감사합니다 :)