Quelle est la meilleure façon d'analyser les données d'une chaîne de requête d'URL (par exemple, les données ajoutées à l'URL par un formulaire) en python? Mon objectif est d'accepter les données du formulaire et de les afficher sur la même page. J'ai recherché plusieurs méthodes qui ne correspondent pas exactement à ce que je recherche.
Je crée un serveur Web simple dans le but d'en apprendre davantage sur les sockets. Ce serveur Web ne sera utilisé qu'à des fins de 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=
Le module urllib.parse est votre ami: https://docs.python.org/3/library/urllib.parse.html
Consultez rllib.parse.parse_qs (analyse d'une chaîne de requête, c'est-à-dire des données de formulaire envoyées au serveur par GET ou des données de formulaire publiées par POST, au moins pour les données non multiparties). Il y a aussi cgi.FieldStorage pour interpréter les données en plusieurs parties.
Pour analyser le reste d'une interaction HTTP, voir RFC2616 , qui est la spécification du protocole HTTP/1.1.
Voici un exemple utilisant 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)
sortie:
{'i': ['main'], 'enc': [' Hello '], 'mode': ['front'], 'sid': ['12ab']}
Remarque pour python2: from urlparse import urlparse, parse_qs
VOIR: https://pythonhosted.org/six/#module-six.moves.urllib.parse
Si vous avez besoin d'une clé unique dans la chaîne de requête, utilisez dict()
avec 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'}
intégré à python 2.7
>>> from urlparse import parse_qs
>>> parse_qs("search=quint&tags=python")
{'search': ['quint'], 'tags': ['python']}