Tham số truy vấn URL đến dict python


98

Có cách nào để phân tích cú pháp URL (với một số thư viện python) và trả về từ điển python với các khóa và giá trị của một phần tham số truy vấn của URL không?

Ví dụ:

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

lợi nhuận mong đợi:

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

Câu trả lời:


187

Sử dụng urllib.parsethư viện :

>>> 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'}

Các urllib.parse.parse_qs()urllib.parse.parse_qsl()phương pháp phân tích cú pháp các chuỗi truy vấn, có tính đến các khóa có thể xuất hiện nhiều lần và thứ tự đó có thể quan trọng.

Nếu bạn vẫn đang sử dụng Python 2, urllib.parseđã được gọi urlparse.


37

Đối với Python 3, các giá trị của dict từ parse_qsnằm trong một danh sách, vì có thể có nhiều giá trị. Nếu bạn chỉ muốn cái đầu tiên:

>>> 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
Đây không phải là duy nhất đối với Python 3, Python 2 urllib.parse_qscũng trả về danh sách cho các giá trị. Tôi đặc biệt đề cập đến điều này trong câu trả lời của mình, nhân tiện, bạn có thể muốn sử dụng urllib.parse_qsl()thay thế và bỏ qua danh sách kết quả dict()nếu bạn chỉ muốn các giá trị đơn lẻ.
Martijn Pieters

Có vẻ như sự khác biệt với parse_qlsnó là vì nó trả về một danh sách các bộ giá trị, chuyển đổi thành một dict sẽ giữ giá trị cuối cùng thay vì giá trị đầu tiên . Tất nhiên, điều này giả định rằng có nhiều giá trị để bắt đầu.
reubano

11

Nếu bạn không muốn sử dụng trình phân tích cú pháp:

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("&") ]}

Vì vậy, tôi sẽ không xóa những gì ở trên nhưng nó chắc chắn không phải là những gì bạn nên sử dụng.

Tôi nghĩ rằng tôi đã đọc một vài câu trả lời và chúng trông hơi phức tạp, trong trường hợp bạn giống như tôi, đừng sử dụng giải pháp của tôi.

Dùng cái này:

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

và cho Python 2.X

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

Tôi biết câu trả lời này giống với câu trả lời được chấp nhận, chỉ trong một lớp lót có thể được sao chép.


6
Phân tích cú pháp liên quan đến nhiều thứ hơn là chỉ tách chuỗi. Bạn cũng cần phải xử lý mã hóa URL (bao gồm cả +) và urllib.parsecũng làm tăng hoặc bỏ qua lỗi cho bạn theo yêu cầu. Tôi không chắc tại sao bạn muốn phát minh lại bánh xe này khi nó là một phần của thư viện tiêu chuẩn.
Martijn Pieters

6

Đối với 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'}

4

Tôi đồng ý về việc không phát minh lại bánh xe nhưng đôi khi (trong khi bạn đang học) việc chế tạo bánh xe để hiểu được bánh xe sẽ giúp ích cho bạn. :) Vì vậy, từ góc độ học thuật thuần túy, tôi đưa ra điều này với lưu ý rằng việc sử dụng từ điển giả định rằng các cặp giá trị tên là duy nhất (rằng chuỗi truy vấn không chứa nhiều bản ghi).

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('&')]

Tôi đang sử dụng phiên bản 3.6.5 trong IDE không hoạt động.


0

Đối với python2.7tôi đang sử dụng urlparsemô-đun để phân tích cú pháp truy vấn url thành dict.

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']} 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.