하얀설표 블로그




예제)쿼리 파라미터를 딕트로 변환하는 방법(url query prameter to dict with python)





( 수정됨)


쿼리 파라미터를 dict 객체로 변환하는 방법(파이썬)

코드

from urllib import parse
url = 'https://httpbin.org/get?key1=value1&key2=value2&key2=value3&key3=value4&key4=%ED%95%9C%EA%B8%80%20%EC%BF%BC%EB%A6%AC%20%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0'
url_split = parse.urlsplit(parse.unquote(url))
query = url_split.query
params = parse.parse_qs(query)
parameter = dict(params)
print(f'url_split : {url_split}')
print(f'query : {query}')
print(f'params : {params}')
print(f'parameter : {parameter}')

>> url_split : SplitResult(scheme='https', netloc='httpbin.org', path='/get', query='key1=value1&key2=value2&key2=value3&key3=value4&key4=한글 쿼리 파라미터', fragment='')
query : key1=value1&key2=value2&key2=value3&key3=value4&key4=한글 쿼리 파라미터
params : {'key1': ['value1'], 'key2': ['value2', 'value3'], 'key3': ['value4'], 'key4': ['한글 쿼리 파라미터']}
parameter : {'key1': ['value1'], 'key2': ['value2', 'value3'], 'key3': ['value4'], 'key4': ['한글 쿼리 파라미터']}

설명

parse.unquote를 사용하는 이유

unquote 함수를 사용하는 이유는 url 인코딩이 적용된 영어 외 문자를 사람이 읽을 수 있는 문자로 변경하기 위해서다.
만약 url 인코딩이 적용된 문자를 그대로 사용하고 싶다면 이 명령을 제외하면 된다.

parse.parse_qsl이 아닌 parse.parse_qs를 사용하는 이유

parse_qs가 아닌 parse_qsl을 사용하면 다음과 같은 결과를 얻을 수 있다.
각 value의 타입이 list가 아닌 str이기 때문에 사람에 따라 이쪽이 더 편하게 보일 수도 있으나, 위 코드의 결과와 비교해보면 key2 값이 2개가 아닌 1개라는 것을 확인할 수 있다.

중복 키값을 사용하는 파라미터가 존재한다면 parses_qsl을 사용했을 때 파라미터값을 온전히 가져올 수 없다.

from urllib.parse import parse_qsl, urlsplit, unquote
url = 'https://httpbin.org/get?key1=value1&key2=value2&key2=value3&key3=value4&key4=%ED%95%9C%EA%B8%80%20%EC%BF%BC%EB%A6%AC%20%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0'
parameter = dict(parse_qsl(urlsplit(unquote(url)).query))
print(f'parameter : {parameter}')

>> parameter : {'key1': 'value1', 'key2': 'value3', 'key3': 'value4', 'key4': '한글 쿼리 파라미터'}

urllib3.util.parse_url

이번 글에서는 urllib.parse.urlsplit을 이용했지만, urllib3.util.parse_url을 사용할 수도 있다.
단순히 url의 쿼리값을 분리하는 것이 목적이라면 차이가 없지만, urllib.parse.urlsplit에서 제공해주지 않는 것들이 필요할 때에는 urllib3.util.parse_url이 좋은 선택이 될 수 있다.

from urllib import parse
from urllib3 import util
url = 'https://httpbin.org/get?key1=value1&key2=value2&key2=value3&key3=value4&key4=%ED%95%9C%EA%B8%80%20%EC%BF%BC%EB%A6%AC%20%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0'
print([parse.urlsplit(parse.unquote(url))])
print([util.parse_url(parse.unquote(url))])
 >> [SplitResult(scheme='https', netloc='httpbin.org', path='/get', query='key1=value1&key2=value2&key2=value3&key3=value4&key4=한글 쿼리 파라미터', fragment='')]
[Url(scheme='https', auth=None, host='httpbin.org', port=None, path='/get', query='key1=value1&key2=value2&key2=value3&key3=value4&key4=%ED%95%9C%EA%B8%80%20%EC%BF%BC%EB%A6%AC%20%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0', fragment=None)]


공감 : 0







white.seolpyo.com