webentwicklung-frage-antwort-db.com.de

Zu diktierende URL-Abfrageparameter python

Gibt es eine Möglichkeit, eine URL zu analysieren (mit einer python library) und ein python dictionary mit den Schlüsseln und Werten eines Abfrageparameterteils der URL zurückzugeben? ?

Beispielsweise:

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

erwartete Rückkehr:

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

Benutze die urllib.parse Bibliothek :

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

Die Methoden urllib.parse.parse_qs() und urllib.parse.parse_qsl() analysieren Abfragezeichenfolgen, wobei berücksichtigt wird, dass Schlüssel mehrmals vorkommen können und diese Reihenfolge von Bedeutung sein kann.

Wenn Sie immer noch auf Python 2, urllib.parse Genannt wurden urlparse .

137
Martijn Pieters

Für Python 3, die Werte des Diktats von parse_qs befinden sich in einer Liste, da möglicherweise mehrere Werte vorhanden sind. Wenn du nur den ersten haben willst:

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

Wenn Sie keinen Parser verwenden möchten:

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

Ich werde also nicht löschen, was oben steht, aber es ist definitiv nicht das, was Sie verwenden sollten.

Ich glaube, ich habe ein paar der Antworten gelesen und sie sahen etwas kompliziert aus, falls Sie so sind wie ich, verwenden Sie nicht meine Lösung.

Benutze das:

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

und für Python 2.X

from urllib import urlparse as parse

Ich weiß, dass dies dasselbe ist wie die akzeptierte Antwort, nur in einem Einzeiler, der kopiert werden kann.

7
Tomos Williams

Für 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
Anurag Misra

Ich bin damit einverstanden, das Rad nicht neu zu erfinden, aber manchmal (während Sie lernen) hilft es, ein Rad zu bauen, um ein Rad zu verstehen. :) Aus rein akademischer Sicht biete ich dies mit dem Vorbehalt an, dass bei der Verwendung eines Wörterbuchs davon ausgegangen wird, dass Name-Wert-Paare eindeutig sind (dass die Abfragezeichenfolge nicht mehrere Datensätze enthält).

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

Ich verwende Version 3.6.5 in der Idle-IDE.

3
Clarius