Расшифровать экранированные символы в 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
Бен


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

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)

8
Зачем вам вручную использовать регулярные выражения и лямбды, когда есть встроенная библиотека, которая делает то, что вам нужно, возможно, даже более продуманно?
Брэд Кох

6
Классное решение! urllib2не является частью стандартного дистрибутива Python. reявляется.
cxxl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.