URL décoder UTF-8 en Python

245

J'ai passé beaucoup de temps en tant que débutant en Python.
Comment pourrais-je jamais décoder une telle URL:

example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0

à celui-ci en python 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) renvoie quelque chose de très laid.

Toujours pas de solution, toute aide est appréciée.

porte-épée
la source
2
Dans le cas général, la queue d'une URL n'est qu'un cookie. Vous ne pouvez pas savoir quel jeu de caractères local codant le serveur utilise ou même si l'URL code une chaîne ou quelque chose de complètement différent. ( D' accord, beaucoup d' URL font encode une chaîne lisible par l' homme, et souvent, vous pouvez deviner l'encodage très facilement , mais il est impossible dans le cas général ou complètement automatique..)
tripleee

Réponses:

398

Les données sont des octets encodés en UTF-8 échappés avec des citations d'URL, donc vous voulez décoder , avec urllib.parse.unquote(), qui gère le décodage des données encodées en pourcentage en octets UTF-8 puis en texte, de manière transparente:

from urllib.parse import unquote

url = unquote(url)

Démo:

>>> from urllib.parse import unquote
>>> url = 'example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0'
>>> unquote(url)
'example.com?title=правовая+защита'

L'équivalent de Python 2 l'est urllib.unquote(), mais cela renvoie un bytestring, donc vous devrez décoder manuellement:

from urllib import unquote

url = unquote(url).decode('utf8')
Martijn Pieters
la source
Alors pourquoi le caractère + est-il laissé dans la chaîne? Je pensais que% 2B était le caractère + et les + littéraux ont été supprimés lors du décodage?
AlexLordThorsen
5
@Rawrgulmuffins +est un espace dans les x-www-form-urlencodeddonnées ; vous utiliseriez urllib.parse.parse_qs()pour analyser cela, ou utiliser urllib.parse.unquote_plus(). Mais ils ne doivent apparaître que dans la chaîne de requête, pas dans le reste de l'URL.
Martijn Pieters
140

Si vous utilisez Python 3, vous pouvez utiliser urllib.parse

url = """example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0"""

import urllib.parse
urllib.parse.unquote(url)

donne:

'example.com?title=правовая+защита'
pavan
la source
utiliser ceci et obtenir un dict au lieu d'une chaîne de requête sur python3.8
Clocker