Декодировать экранированные символы в URL - PullRequest
71 голосов
/ 15 ноября 2011

У меня есть список, содержащий 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

Ответы [ 5 ]

121 голосов
/ 15 ноября 2011

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

urllib.unquote( строка )

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

Пример: unquote('/%7Econnolly/') выход '/~connolly/'.

А потом просто декодируй.


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

urllib.parse.unquote(url)

Python 3 документа.

24 голосов
/ 04 января 2016

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

urllib.parse.unquote(url)
9 голосов
/ 10 декабря 2015

или 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)'
7 голосов
/ 15 ноября 2011

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

4 голосов
/ 26 марта 2013
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...