Supposons que l'on me donne une URL.
Il peut déjà avoir des paramètres GET (par exemple http://example.com/search?q=question
) ou pas (par exemple http://example.com/
).
Et maintenant, je dois y ajouter des paramètres comme {'lang':'en','tag':'python'}
. Dans le premier cas, je vais avoir http://example.com/search?q=question&lang=en&tag=python
et dans le second - http://example.com/search?lang=en&tag=python
.
Existe-t-il un moyen standard de le faire?
urlparse.parse_qs
place deparse_qsl
. Ce dernier renvoie une liste alors que vous voulez un dict. Voir docs.python.org/library/urlparse.html#urlparse.parse_qs .urlencode
tant queurllib.urlencode(query, doseq=True)
. Sinon, les paramètres qui existaient dans l'url d'origine ne sont pas conservés correctement (car ils sont renvoyés sous forme de tuples de @ parse_qs @urlparse()
eturlsplit()
sont en fait desnamedtuple
instances. Ainsi, vous pouvez les affecter directement à une variable et utiliserurl_parts = url_parts._replace(query = …)
pour la mettre à jour.Pourquoi
Je n'ai pas été satisfait de toutes les solutions sur cette page ( allez, où est notre chose préférée de copier-coller? ) Alors j'ai écrit la mienne en fonction des réponses ici. Il essaie d'être complet et plus pythonique. J'ai ajouté un gestionnaire pour les valeurs dict et booléen dans les arguments pour être plus convivial côté consommateur ( JS ), mais ils sont encore facultatifs, vous pouvez les supprimer.
Comment ça fonctionne
Test 1: Ajout de nouveaux arguments, gestion des tableaux et des valeurs booléennes:
Test 2: réécriture d'arguments existants, gestion des valeurs DICT:
Parler n'est pas cher. Montre-moi le code.
Code lui-même. J'ai essayé de le décrire en détail:
Sachez qu'il peut y avoir des problèmes, si vous en trouvez un, faites-le moi savoir et nous améliorerons cette chose
la source
http://stackoverflow.com/with%2Fencoded?data=some&data=values&answe%2rs=false
. Aussi, utilisez trois chevrons>>>
pour aider les docteurs à récupérer vos docteursparsed_get_args = dict(parse_qsl(get_args))
pourparsed_get_args = parse_qs(get_args)
Vous souhaitez utiliser le codage URL si les chaînes peuvent contenir des données arbitraires (par exemple, des caractères tels que des esperluettes, des barres obliques, etc. devront être codés).
Découvrez urllib.urlencode:
En python3:
la source
Vous pouvez également utiliser le module furl https://github.com/gruns/furl
la source
Externaliser vers la bibliothèque de requêtes testées au combat .
Voici comment je vais le faire:
la source
Si vous utilisez les requêtes lib :
la source
Oui: utilisez urllib .
D'après les exemples de la documentation:
la source
Sur la base de cette réponse, une ligne pour les cas simples (code Python 3):
ou:
la source
?
dans l'ancre (#?stuff
).Je trouve cela plus élégant que les deux principales réponses:
Les choses les plus importantes que je n'aime pas dans les premières réponses (elles sont néanmoins bonnes):
query
trouve les composants URLParseResult
Ce qui est mauvais dans ma réponse, c'est l'aspect magique
dict
fusion utilise le déballage, mais je préfère cela à la mise à jour d'un dictionnaire déjà existant en raison de mes préjugés contre la mutabilité.la source
J'ai aimé la version Łukasz, mais comme les fonctions urllib et urllparse sont un peu difficiles à utiliser dans ce cas, je pense qu'il est plus simple de faire quelque chose comme ceci:
la source
Utilisez les différentes
urlparse
fonctions pour déchirer l'URL existante,urllib.urlencode()
sur le dictionnaire combiné, puisurlparse.urlunparse()
pour tout remettre ensemble.Ou prenez simplement le résultat de
urllib.urlencode()
et concaténez-le à l'URL de manière appropriée.la source
Encore une autre réponse:
la source
Voici comment je l'ai implémenté.
A travaillé comme un charme. Cependant, j'aurais aimé une façon plus propre de mettre en œuvre cela.
Une autre façon de mettre en œuvre ce qui précède est de le mettre dans une méthode.
la source
En python 2.5
la source