Расшифровать экранированные символы в URL

83

У меня есть список, содержащий URL-адреса с экранированными символами в них. Эти символы были установлены, urllib2.urlopenкогда он восстанавливает страницу 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 

Есть ли способ вернуть их в неэкранированную форму в Python?

PS: URL-адреса закодированы в utf-8

Тони
источник

Ответы:

144

Официальные документы.

urllib.unquote(строка)

Замените %xxescape-символы их односимвольными эквивалентами.

Пример: unquote('/%7Econnolly/')урожайность '/~connolly/'.

А потом просто расшифруйте.


Обновление: для Python 3 напишите следующее:

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

Документы Python 3.

Игнасио Васкес-Абрамс
источник
unquote показывает, как я сказал выше sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1\xb5&action=edi ... может быть, я не очень хорошо объяснил себя в этом случае ... но url - китайский, и я хочу декодировать его до оригинального символа, а не без кавычек
Тони
3
@dyoser Вы должны указать это в своем вопросе.
Крис Харпер
@ root45 это комментарий к одному ответу ... так что здесь хорошо. Спасибо за вашу признательность.
Тони
11
Замечу, что для python3 этоurllib.parse.unquote
tayfun
4
Для python3 это тоже естьurllib.request.unquote
Бен
30

И если вы используете, Python3вы можете использовать:

import urllib.parse
urllib.parse.unquote(url)
Владир Паррадо Крус
источник
Также вurllib.request.unquote
Бен
11

или же 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
источник
7

Вы можете использовать urllib.unquote

Клаус Бысков Педерсен
источник
когда я использую unquote (кстати, спасибо ...), он показывает эту строку sample.com/index.php?title= \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 & action = edi, и я знаю, что это китайские символы ... как их увидеть? Полагаю, это юникод, верно?
Тони
Это уже в вашем вопросе. Это байты UTF-8; вы можете преобразовать их в строку Unicode с b"\xe9\xa6\x96\xe9\xa1\xb5".decode("utf-8")помощью (используя теперь несколько более современный синтаксис Python).
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
источник
8
Зачем вам вручную использовать регулярные выражения и лямбды, когда есть встроенная библиотека, которая делает то, что вам нужно, возможно, даже более продуманно?
Брэд Кох
6
Классное решение! urllib2не является частью стандартного дистрибутива Python. reявляется.
cxxl