100 votes

Décoder les caractères échappés dans l'URL

Je dispose d'une liste contenant des URL avec des caractères échappés. Ces caractères ont été définis par urllib2.urlopen lorsqu'il récupère la page html :

http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=edit
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=history
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&variant=zh 

Existe-t-il un moyen de les retransformer en leur forme non échappée en python ?

N.B. : Les URLs sont encodées en utf-8

184voto

Ignacio Vazquez-Abrams Points 312628

En utilisant le paquet urllib (import urllib) :

Python 2.7

À partir de la documentation officielle :

urllib.unquote(string)

Remplace les échappements %xx par leur équivalent en un seul caractère.

Exemple : unquote('/%7Econnolly/') donne '/~connolly/'.

Python 3

À partir de la documentation officielle :

urllib.parse.unquote(string, encoding='utf-8', errors='replace')

[...]

Exemple : unquote('/El%20Ni%C3%B1o/') donne '/El Niño/'.

34voto

Et si vous utilisez Python3, vous pourriez utiliser :

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

0 votes

Aussi en urllib.request.unquote

17voto

dli Points 933

Ou urllib.unquote_plus

>>> import urllib
>>> urllib.unquote('érythrocyte+membrane+protéin+1%2C+PfEMP1+%28VAR%29')
'érythrocyte+membrane+protéin+1,+PfEMP1+(VAR)'
>>> urllib.unquote_plus('érythrocyte+membrane+protéin+1%2C+PfEMP1+%28VAR%29')
'érythrocyte membrane protéin 1, PfEMP1 (VAR)'

7voto

Vous pouvez utiliser urllib.unquote

0 votes

Lorsque j'utilise le unquote (merci d'ailleurs...), il affiche cette chaîne sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1\xb5&action=e‌​di et je sais qu'il s'agit de caractères chinois... comment puis-je les voir? Je suppose que c'est de l'unicode, n'est-ce pas?

0 votes

C'est déjà dans votre question. Ce sont les octets UTF-8; vous pouvez les convertir en chaîne Unicode avec b"\xe9\xa6\x96\xe9\xa1\xb5".decode("utf-8") (en utilisant une syntaxe Python légèrement plus moderne maintenant).

5voto

mistercx Points 487
import re

def unquote(url):
  return re.compile('%([0-9a-fA-F]{2})',re.M).sub(lambda m: chr(int(m.group(1),16)), url)

8 votes

Pourquoi voudriez-vous utiliser manuellement des regex et des lambdas alors qu'il existe une bibliothèque intégrée qui fait ce dont vous avez besoin, probablement même de manière plus réfléchie?

7 votes

Cool solution! urllib2 n'est pas partie de la distribution standard de python. re l'est.

1 votes

Parfois, l'analyse d'HTML avec des expressions régulières n'est pas la meilleure idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X