Dekoduj znaki ucieczki w adresie URL

83

Mam listę zawierającą adresy URL ze znakami ucieczki. Te znaki zostały ustawione, urllib2.urlopengdy odzyskuje stronę 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 

Czy istnieje sposób, aby przekształcić je z powrotem w ich niezmienną formę w Pythonie?

PS: adresy URL są zakodowane w utf-8

Tony
źródło

Odpowiedzi:

144

Oficjalne dokumenty.

urllib.unquote(strunowy)

Zastąp %xxznaki ucieczki ich jednoznakowym odpowiednikiem.

Przykład: unquote('/%7Econnolly/')plony '/~connolly/'.

A potem po prostu dekoduj.


Aktualizacja: w przypadku języka Python 3 napisz:

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

Dokumentacja Python 3.

Ignacio Vazquez-Abrams
źródło
unquote pokazuje, jak powiedziałem powyżej sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1\xb5&action=edi ... może nie wyjaśniłem się zbyt dobrze w tym przypadku ... ale url jest chiński i chcę zdekodować go na oryginalny znak, a nie ten bez cudzysłowu
Tony
3
@dyoser Musisz umieścić to w swoim pytaniu.
Kris Harper
@ root45 to jest komentarz do jednej odpowiedzi ... więc tutaj jest dobrze. Dziękuję że mnie doceniłeś.
Tony
11
Tylko uwaga, że ​​dla pythona3 jest tourllib.parse.unquote
tayfun
4
W przypadku pythona3 jest również dostępnyurllib.request.unquote
Ben
30

A jeśli używasz, Python3możesz użyć:

import urllib.parse
urllib.parse.unquote(url)
Vladir Parrado Cruz
źródło
Również wurllib.request.unquote
Ben
11

lub urllib.unquote_plus

>>> import urllib
>>> urllib.unquote('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29')
'erythrocyte+membrane+protein+1,+PfEMP1+(VAR)'
>>> urllib.unquote_plus('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29')
'erythrocyte membrane protein 1, PfEMP1 (VAR)'
dli
źródło
7

Możesz użyć urllib.unquote

Klaus Byskov Pedersen
źródło
kiedy używam unquote (dzięki przy okazji ...) pokazuje ten ciąg sample.com/index.php?title= \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 & action = edi i wiem, że to chińskie znaki ... jak mogę je zobaczyć? Myślę, że to Unicode, prawda?
Tony
To już jest twoje pytanie. To są bajty UTF-8; możesz przekonwertować je na łańcuch Unicode za b"\xe9\xa6\x96\xe9\xa1\xb5".decode("utf-8")pomocą (używając teraz nieco nowszej składni Pythona).
tripleee
5
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)
mistercx
źródło
8
Dlaczego miałbyś ręcznie używać wyrażeń regularnych i lambd, skoro istnieje wbudowana biblioteka, która robi to, czego potrzebujesz, prawdopodobnie nawet bardziej przemyślane?
Brad Koch,
6
Fajne rozwiązanie! urllib2nie jest częścią standardowej dystrybucji Pythona. rejest.
cxxl