Seite 1 von 1

uri parsen

Verfasst: Samstag 11. August 2007, 04:44
von Volvic
hallo,

ich möchte folgende uri parsen:
nun mit RegEx ist das zwar machbar, jedoch habe ich damit noch viele probleme. gibt es dafür nichts fertiges, z.b. beim urlparse modul ist was von parametern beschrieben worden?

Verfasst: Samstag 11. August 2007, 04:57
von veers
Wie möchtest du die URL denn geparst haben? Willst du den Querystring geparst haben? Oder willst du Protokol, Domain, Pfad und Query?

Verfasst: Samstag 11. August 2007, 06:23
von Volvic
momentan benötige ich nur den query teil. soweit war ich mit urlparse allerdings auch schon:
>>> import urlparse
>>> u = urlparse.urlparse('http://example.com/download?file=test.t ... d=14789632')
>>> u
('http', 'example.com', '/download', '', 'file=test.tar.gz&sid=14789632', '')
>>>
also beim ersten ? wird es entfernt, soweit okay, nur wollte ich eben die query angaben später in einem dict speichern zum weiterverarbeiten des requests also aus:
soll das werden:

Code: Alles auswählen

query_vars = {
  'file' : 'test.tar.gz',
  'sid' : '14789632'
}

Verfasst: Samstag 11. August 2007, 07:18
von Y0Gi
Frei aus dem Kopf tippe ich darauf, dass ``cgi.parse_qs`` deine Anforderung erfüllt.

Verfasst: Samstag 11. August 2007, 07:29
von EnTeQuAk
Ungetestet, aber so wird es angewendet:

Code: Alles auswählen

query_vars = []
for key, values in cgi.parse_qs(query_string, True).iteritems():
    for value in values:
        value = value.decode('utf-8', 'ignore')
        query_vars.append(key, value)
Und schon hast du den Query in einer Dictionary ähnlichen Struktur.

Beachte, das ``value.decode`` irgentwie anders mit dem Charset umgeht bzw. Konfigurierbar ist.

Für einen besseren Zugriff könnte sich noch eine Art "MultiDict" erweisen. Ein Beispiel, legt Werkzeug mal vor: http://trac.pocoo.org/browser/werkzeug/ ... ils.py#L24

Ansonsten hängt das natürlich klar vom Anwendungsgebiet ab.


MfG EnTeQuAk

Verfasst: Samstag 11. August 2007, 08:51
von Volvic
perfekt danke, dann kann ich meine regex weglassen :)