URL-Abfrageparameter zum Diktieren von Python

98

Gibt es eine Möglichkeit, eine URL (mit einer Python-Bibliothek) zu analysieren und ein Python-Wörterbuch 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}
Leonardo Andrade
quelle

Antworten:

187

Verwenden Sie die urllib.parseBibliothek :

>>> 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 noch auf Python 2 sind, urllib.parsewurde aufgerufen urlparse.

Martijn Pieters
quelle
36

Bei Python 3 befinden sich die Werte des Diktats von parse_qsin einer Liste, da möglicherweise mehrere Werte vorhanden sind. Wenn Sie nur den ersten wollen:

>>> 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'}
reubano
quelle
1
Dies gilt nicht nur für Python 3, Python 2 gibt urllib.parse_qsauch Listen für die Werte zurück. Ich erwähne dies in meiner Antwort ausdrücklich. Übrigens möchten Sie möglicherweise urllib.parse_qsl()stattdessen verwenden und die resultierende Liste hinter sich lassen, dict()wenn Sie nur einzelne Werte möchten.
Martijn Pieters
Der Unterschied scheint darin zu bestehen parse_qls, dass bei der Konvertierung in ein Diktat der letzte Wert anstelle des ersten beibehalten wird , da eine Liste von Tupeln zurückgegeben wird . Dies setzt natürlich voraus, dass es zunächst mehrere Werte gab.
Reubano
11

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 einige der Antworten gelesen und sie sahen etwas kompliziert aus, falls Sie wie ich sind, verwenden Sie meine Lösung nicht.

Benutze das:

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

und für Python 2.X.

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

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

Tomos Williams
quelle
6
Das Parsen umfasst mehr als nur das Teilen der Zeichenfolge. Sie müssen auch die URL-Codierung (einschließlich der +) verarbeiten, und die urllib.parseFehler werden bei Bedarf entweder für Sie ausgelöst oder ignoriert. Ich bin mir nicht sicher, warum Sie dieses Rad neu erfinden möchten, wenn es Teil der Standardbibliothek ist.
Martijn Pieters
6

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'}
Anurag Misra
quelle
4

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 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.

Clarius
quelle
0

Denn python2.7ich benutze urlparseModul, um URL-Abfragen zu analysieren, um zu diktieren.

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']} 
Tamim
quelle