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.


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')

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=правовая+защита'

utiliser ceci et obtenir un dict au lieu d'une chaîne de requête sur python3.8
Clocker
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.