Construire la chaîne de requête à l'aide de la fonction urlencode python
Je suis en train de construire une url pour que je puisse envoyer une requête get à l'aide de urllib
module.
Supposons que mon final_url
devrait être
url = "www.example.com/find.php?data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value"
Dès maintenant pour réaliser cela, j'ai essayé la manière suivante:
>>> initial_url = "http://www.stackoverflow.com"
>>> search = "Generate+value"
>>> params = {"data":initial_url,"search":search}
>>> query_string = urllib.urlencode(params)
>>> query_string
'search=Generate%2Bvalue&data=http%3A%2F%2Fwww.stackoverflow.com'
Maintenant, si vous comparez mon query_string
avec le format de final_url
vous pouvez observateur de deux choses
1) L'ordre de paramètres sont inversés au lieu de data=()&search=
il est search=()&data=
2) urlencode
aussi encodé le +
dans Generate+value
Je crois que le premier changement est dû à l'aléatoire du comportement de dictionnaire. Donc, j'ai bien de l'aide OrderedDict
pour inverser le dictionnaire. Comme, je suis en utilisant python 2.6.5
je n'ai
pip install ordereddict
Mais je ne suis pas capable de l'utiliser dans mon code quand j'essaye
>>> od = OrderedDict((('a', 'first'), ('b', 'second')))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'OrderedDict' is not defined
Donc, ma question est quelle est la façon correcte d'utiliser OrderedDict
en python 2.6.5 et comment puis-je faire urlencode
ignore la +
dans Generate+value
.
Aussi, est-ce la bonne approche pour construire URL
.
OriginalL'auteur RanRag | 2012-05-26
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas vous inquiéter au sujet de l'encodage de la
+
il doit être remis sur le serveur après unescaping l'url. L'ordre des paramètres nommés ne devrait pas d'importance.Considérant OrderedDict, il n'est pas Python intégré. Vous devez l'importer à partir de
collections
:si votre python est trop vieux et n'a pas OrderedDict dans le module
collections
, utilisation:De toute façon, l'ordre des paramètres n'a plus d'importance.
Note le
safe
paramètre dequote
. Il empêche+
être échappé, mais il signifie , le serveur va interpréterGenerate+value
commeGenerate value
. Vous pouvez manuellement échapper+
par écrit%2B
et le marquage%
aussi sûr char:from collections import OrderedDict
mais maintenant, je suisImportError: cannot import name OrderedDict
. Je suis à l'aide de python2.6.5
Il devrait être disponible à partir de pyton 2.4. Ce n'jou obtenir si vous exécutez
import collections
?Je peux réussir à l'importation de collecte aucune erreur n'est générée. J'ai bien
OrderedDict
a été introduit à partir de python 2.7 partir.OriginalL'auteur Aleš Kotnik
Tout d'abord, l'ordre des paramètres dans une requête http doit être complètement hors de propos. Si ce n'est pas le cas, alors l'analyse de la bibliothèque sur l'autre côté est en train de faire quelque chose de mal.
Deuxième, bien sûr, le
+
est codé.+
est utilisé comme espace réservé pour un espace dans une url encodée, donc si yor raw chaîne contient un+
, ce qui a échappé.urlencode
s'attend à une forme non codée chaîne de caractères, vous ne pouvez pas passer une chaîne de caractères qui est déjà codé.OriginalL'auteur mata
Quelques commentaires sur la question et les autres réponses:
urllib.urlencode
, soumettre une séquence ordonnée de k/v paires au lieu de cartographie(dict). lorsque vous passez dans un dict,urlencode
appelle justefoo.items()
pour saisir un objet iterable séquence.# urllib.urlencode accepts a mapping or sequence
# the output of this can vary, because `items()` is called on the dict
urllib.urlencode({"data": initial_url,"search": search})
# the output of this will not vary
urllib.urlencode((("data", initial_url), ("search", search)))
vous pouvez également passer dans un secondard
doseq
argument pour ajuster la manière dont itérable les valeurs sont gérées.L'ordre des paramètres n'est pas pertinent. prendre ces deux url, par exemple:
https://example.com?foo=bar&bar=foo
https://example.com?bar=foo&foo=bar
Un serveur http doit prendre en considération l'ordre de ces paramètres sans intérêt, mais une fonction conçue pour comparer les Url ne serait pas. Afin de comparer en toute sécurité les url, ces paramètres devront être triés.
Cependant, envisager des doubles de clés:
https://example.com?foo=3&foo=2&foo=1
L'URI spécifications de soutien des doubles de clés, mais elles ne traitent pas de la priorité ou de la commande.
Dans une application donnée, il pourrait à chaque déclenchement des résultats différents et être valide ainsi:
+
est un caractère réservé qui représente un espace dans un urlencoded forme (vs%20
pour la partie du chemin).urllib.urlencode
s'échappe à l'aide deurllib.quote_plus()
, pasurllib.quote()
. L'OP voulait sans doute faire ça:initial_url = "http://www.stackoverflow.com"
search = "Generate value"
urllib.urlencode((("data", initial_url), ("search", search)))
Qui produit:
data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value
que la sortie.
OriginalL'auteur Jonathan Vanasco