2011-11-15 3 views
44

У меня есть список, содержащий URL-адреса с экранированными символами. Эти символы были установлены urllib2.urlopen, когда он восстанавливает HTML страницы:Декодирование экранированных символов по URL

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 

Есть ли способ, чтобы превратить их обратно в немаскированной форму питона?

P.S .: URL-адреса кодируются в UTF-8

ответ

82

Official docs.

urllib.unquote(Строка)

%xx Заменить побеги их односимвольном эквивалент.

Пример: unquote('/%7Econnolly/') дает '/~connolly/'.

А затем просто расшифровать.


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

urllib.parse.unquote(url) 

Python 3 docs.

+0

на Unquote шоу, как я сказал выше sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1 \ xb5 & action = edi ... может быть, я не очень хорошо себя объяснил в этом случае ... но URL-адрес является китайским, и я хочу его декодировать на его оригинальный символ, а не на unquote. – dyoser

+3

@dyoser Вам нужно поставить это в вашем вопросе. –

+0

@ root45 это комментарий к одному ответу ... так что здесь хорошо. Спасибо за вашу оценку. – dyoser

6

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

+0

, когда я использую unquote (спасибо, кстати ...), он показывает эту строку http: //sample.com/index.php? Title = \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 & action = edi, и я знаю, что они китайские символы ... как я могу их увидеть? Я думаю, это юникод, не так ли? – dyoser

+0

Это уже в вашем вопросе. Это байты UTF-8; вы можете преобразовать их в строку Unicode с помощью 'b" \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 ".decode (" utf-8 ")' (используя теперь более современный синтаксис Python). – tripleee

3
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) 
+7

Почему вы вручную используете regex и lambdas, когда есть встроенная библиотека, которая делает то, что вам нужно, возможно, еще более задумчиво? –

+4

Прохладный раствор! 'urllib2' не входит в стандартный дистрибутив python. 're' есть. – cxxl

9

или 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)' 
18

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

urllib.parse.unquote(url) 
+0

Также в 'urllib.request.unquote' – Ben

Смежные вопросы