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}

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.


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

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.


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

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.


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']} 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.