dict python에 대한 URL 쿼리 매개 변수


101

URL (일부 Python 라이브러리 포함)을 구문 분석하고 URL의 쿼리 매개 변수 부분의 키와 값으로 Python 사전을 반환하는 방법이 있습니까?

예를 들면 :

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

기대 수익 :

{'ct':32, 'op':92, 'item':98}

답변:


191

urllib.parse라이브러리 사용 :

>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}

urllib.parse.parse_qs()urllib.parse.parse_qsl() 방법은 키를 한 번 이상 발생할 수 순서가 중요 할 수 있음을 고려하여, 쿼리 문자열을 구문 분석합니다.

파이썬이 여전히있는 경우, urllib.parse불렀다 urlparse.


38

Python 3의 parse_qs경우 여러 값이있을 수 있으므로 dict의 값이 목록에 있습니다. 첫 번째 것을 원하는 경우 :

>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}

1
이것은 Python 3에 고유하지 않으며 Python 2 urllib.parse_qs는 값 목록도 반환합니다. 나는 내 대답에서 이것을 구체적으로 언급했다 . 단일 값을 원한다면 urllib.parse_qsl()대신 사용 하고 결과 목록을 dict()지나칠 수 있습니다.
Martijn Pieters

차이처럼 보인다와 parse_qls있다가 변환, 튜플의 목록을 반환하기 때문에 그 것을 킵하는 딕셔너리에 마지막 대신 값 첫 번째 . 물론 이것은 시작해야 할 여러 값이 있다고 가정합니다.
reubano

11

파서를 사용하지 않으려면 :

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

따라서 위의 내용을 삭제하지는 않겠지 만 반드시 사용해야하는 것은 아닙니다.

나는 몇 가지 답변을 읽은 것 같아서 조금 복잡해 보였습니다. 당신이 나와 같으면 내 솔루션을 사용하지 마십시오.

이것을 사용하십시오 :

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

및 Python 2.X

import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

나는 이것이 허용되는 답변과 동일하다는 것을 알고 있습니다.


7
구문 분석에는 단순히 문자열을 분할하는 것 이상이 포함됩니다. 또한 URL 인코딩 (포함 +) 을 처리해야하며 urllib.parse는 요청에 따라 오류를 발생 시키거나 무시합니다. 이 바퀴가 표준 라이브러리의 일부일 때이 바퀴를 왜 재발 명하고 싶은지 잘 모르겠습니다.
Martijn Pieters

6

Python 2.7의 경우

In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"

In [15]: from urlparse import urlparse, parse_qsl

In [16]: parse_url = urlparse(url)

In [17]: query_dict = dict(parse_qsl(parse_url.query))

In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}

5

나는 바퀴를 재발 명하지 않는 것에 동의하지만 때로는 (학습하는 동안) 바퀴를 이해하기 위해 바퀴를 만드는 데 도움이됩니다. :) 순전히 학문적 관점에서 저는 사전을 사용하면 이름 값 쌍이 고유하다고 가정합니다 (쿼리 문자열에 여러 레코드가 포함되어 있지 않음).

url = 'http:/mypage.html?one=1&two=2&three=3'

page, query = url.split('?')

names_values_dict = dict(pair.split('=') for pair in query.split('&'))

names_values_list = [pair.split('=') for pair in query.split('&')]

Idle IDE에서 버전 3.6.5를 사용하고 있습니다.


0

들어 python2.7내가 사용하고 urlparse구문 분석 URL 쿼리에 대한 딕셔너리에 모듈을.

import urlparse

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.