2012-04-11 24 views
32

Qual è il modo migliore per analizzare i dati da una stringa di query URL (ad esempio, i dati aggiunti all'URL da un modulo) in python? Il mio obiettivo è accettare i dati del modulo e visualizzarli sulla stessa pagina. Ho studiato diversi metodi che non sono esattamente quello che sto cercando.Il modo migliore per analizzare una stringa di query URL

Sto creando un semplice server Web con l'obiettivo di conoscere le prese. Questo server Web non verrà utilizzato per scopi diversi da quelli di test.

GET /?1pm=sample&2pm=&3pm=&4pm=&5pm= HTTP/1.1 
Host: localhost:50000 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: http://localhost:50000/?1pm=sample&2pm=&3pm=&4pm=&5pm= 
+0

Sei tu? ooking per scrivere l'analisi da zero, o cosa? – Marcin

+2

Cosa c'è di sbagliato in http://stackoverflow.com/questions/1349367/parse-an-http-request-authorization-header-with-python o http://stackoverflow.com/questions/4685217/parse-raw-http- intestazioni. Non ci hai dato abbastanza informazioni su quali altri approcci mancano. Hai un esempio di intestazione o due? –

+0

Nulla è "sbagliato" con nessuno di questi post. Sulla base delle esperienze di programmazione che ho avuto in passato, sono propenso a fare qualcosa di simile a un'espressione regolare nel secondo link. Tuttavia, volevo chiedere e vedere se c'è un modo più semplice per farlo poiché questo è il mio primo programma Python. – egoskeptical

risposta

41

Il modulo urllib.parse è tuo amico: https://docs.python.org/3/library/urllib.parse.html

Partenza urllib.parse.parse_qs (l'analisi di una query-string, vale a dire i dati del modulo inviati al server dai dati GET o formare postato da POST, almeno per non -multipart data). C'è anche cgi.FieldStorage per interpretare dati multipart.

Per analizzare il resto di un'interazione HTTP, vedere RFC2616, che è la specifica del protocollo HTTP/1.1.

+1

Questo è buono, ma niente come una soluzione completa. – Marcin

+1

Non sto scrivendo la sceneggiatura per lui. Ha chiesto in particolare come analizzare i dati delle query, almeno questo è quello che ho letto tra le righe, anche se quelle non sono in realtà intestazioni HTTP. Ma non mi sono preoccupato di commentarlo. – modelnine

+0

Non sto suggerendo che dovresti scrivere la sceneggiatura per lui, ma urlparse è solo un piccolo pezzo di questo puzzle. – Marcin

12

Ecco un esempio utilizzando python3 urllib.parse:

>>> from urllib.parse import urlparse, parse_qs 
>>> URL='https://someurl.com/with/query_string?i=main&mode=front&sid=12ab&enc=+Hello' 
>>> parsed_url = urlparse(URL) 
>>> parse_qs(parsed_url.query) 
{'i': ['main'], 'enc': [' Hello '], 'mode': ['front'], 'sid': ['12ab']} 

Nota per python2: from urlparse import urlparse, parse_qs

VEDI: https://pythonhosted.org/six/#module-six.moves.urllib.parse

+0

E perché i valori come questo '' '['value']' ''? '' 'dic ['enc']' '' gets '' '['Hello']' '' - come ottenere 'Hello'? con split? – Suisse

+0

@Suisse vedi https://stackoverflow.com/questions/11447391/ajax-why-jquery-replaces-with-a-space i valori sono in una lista perché più valori possono essere codificati vedi: https://stackoverflow.com/questions/2571145/urlencode-an-array-of-values ​​spero che aiuti – jmunsch

1

Se avete bisogno di chiave univoca dalla stringa di ricerca, clicca dict() con parse_qsl()

import urllib.parse 
urllib.parse.urlparse('https://someurl.com/with/query_string?a=1&b=2&b=3').query 
    a=1&b=2&b=3 
urllib.parse.parse_qs('a=1&b=2&b=3'); 
    {'a': ['1'], 'b': ['2','3']} 
urllib.parse.parse_qsl('a=1&b=2&b=3') 
    [('a', '1'), ('b', '2'), ('b', '3')] 
dict(urllib.parse.parse_qsl('a=1&b=2&b=3')) 
    {'a': '1', 'b': '3'} 
Problemi correlati