web-dev-qa-db-fra.com

Meilleure façon d'analyser une chaîne de requête URL

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=
42
egoskeptical

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.

44
modelnine

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

28
jmunsch

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'}
8
ahuigo

intégré à python 2.7

>>> from urlparse import parse_qs
>>> parse_qs("search=quint&tags=python")
{'search': ['quint'], 'tags': ['python']}
1
Cuyler Quint