2012-07-01 8 views
19

Ich habe diese URL = https://stackoverflow.com/questions/ask?next=1&value=3 Jetzt muss ich die Abfrage Zeichenfolge von dieser URL abrufen. Ich don; t möchte request.META verwenden, um Abfragezeichenfolge abzurufen. Wie immer habe ich es heraus, dass es zwei weitere Möglichkeiten, um die Query-String-Der beste Weg, Abfrage-String von einer URL in Python zu bekommen?

  1. Mit urlparse Verwenden urlparse.urlparse (url) .query dats es

  2. über URL kodieren zu erhalten Verwenden urlencode und das Wörterbuch params request.GET passieren hinein, die String-Darstellung davon zu bekommen ....

Welcher Weg ist besser, um den Abfrage-String zu bekommen ...? Einige meiner Kollegen sagen, dass Urlencode ist viel besser, aber ich bin nicht zufrieden wid dort Antworten soweit .. wie sie erwähnt urlparse Anrufe urlencode intern auch .. Auch in diesem Punkt habe ich Zweifel, wie ich denke, urlparse und urlencode sind völlig independent.as urlencode ist im urllib-modul .... bitte klär das ding.

Antwort

38

Sie können wie Query-String mit GET-Parameter machen dieses

request.GET.urlencode() 

Dies schließt das Präfix ? nicht ein und es gibt möglicherweise nicht die Schlüssel in der gleichen Reihenfolge wie in der ursprünglichen Anforderung zurück.

+7

Es ist wichtig zu beachten, dass request.GET.urlencode(), da QueryDict ein ungeordnetes Wörterbuch umschließt, Schlüssel möglicherweise nicht in derselben Reihenfolge zurückgibt, in der sie in dem ursprünglichen Anforderungs-URI angezeigt werden. – Aaron

+1

Das ist eine fundamentale von Wörterbüchern tatsächlich. Darüber hinaus sollten die meisten Abfragezeichenfolgen als ungeordnet betrachtet werden, wenn sie codiert sind. Wenn es eine echte Liste ist, wird es bestellt. – uchuugaka

50

Dritte Option:

>>> from urlparse import urlparse, parse_qs 
>>> url = 'http://something.com?blah=1&x=2' 
>>> urlparse(url).query 
'blah=1&x=2' 
>>> parse_qs(urlparse(url).query) 
{'blah': ['1'], 'x': ['2']} 

In Python 3 + dies ist erhältlich als:

from urllib.parse import parse_qs 

Documentation for urllib.parse

+6

Okay, nicht ganz sicher, warum Sie die Abfragezeichenfolge möchten und nicht verarbeitet haben, aber die Verwendung von URLparse ist die lesbarste und verständlichste Methode. –

+0

Das hat mir wirklich geholfen - ich brauchte eine Karte (oder irgendein Objekt), die die Parameter von einer Anfrage-URL enthielt! –