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