2011-11-15 47 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 .:的網址爲UTF-8

回答

82

Official docs.

urllib.unquote(編碼的字符串)

可以通過單字符等效替換%xx逃逸。

例如:unquote('/%7Econnolly/')得出'/~connolly/'

然後只是解碼。


更新: 對於Python 3,編寫如下:

urllib.parse.unquote(url) 

Python 3 docs.

+0

的引文結束演出正如我上面說sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1 \ xb5&action = edi ...也許我在這種情況下沒有很好地解釋我自己......但是url是一箇中國人,我想解碼爲原始字符,而不是沒有引號的字符 – 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,我知道他們是中國人的字符......我怎麼能看到他們?我想這是unicode,對吧? – dyoser

+0

這已經是你的問題了。這些是UTF-8字節;你可以用'b「\ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5」.decode(「utf-8」)(現在使用更現代的Python語法)將它們轉換爲Unicode字符串。 – 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

爲什麼當手動使用正則表達式和lambda表達式時,有一個內置的庫可以滿足您的需求,可能會更深思熟慮? –

+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

相關問題