2011-11-15 6 views
44

Tôi có danh sách chứa các URL có ký tự thoát trong chúng. Những nhân vật đã được thiết lập bởi urllib2.urlopen khi nó phục hồi trang html:Giải mã các ký tự thoát trong 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 

Có cách nào để chuyển đổi chúng trở lại hình thức unescaped của họ trong python?

P.S .: Các URL được mã hóa trong utf-8

Trả lời

82

Official docs.

urllib.unquote(chuỗi)

Thay %xx thoát bởi đơn nhân vật tương đương của họ.

Ví dụ: unquote('/%7Econnolly/') sản lượng '/~connolly/'.

Và sau đó chỉ giải mã.


Cập nhật: Đối với Python 3, viết như sau:

urllib.parse.unquote(url) 

Python 3 docs.

+0

các chương trình unquote như tôi đã nói ở trên sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1 \ xb5 & action = edi ... có lẽ tôi đã không giải thích bản thân mình rất tốt trong trường hợp này ... nhưng url là một người Trung Quốc và tôi muốn giải mã nó là char gốc, không phải là unquote – dyoser

+3

@dyoser Bạn cần phải đặt trong câu hỏi của bạn. –

+0

@ root45 đây là một bình luận cho một câu trả lời ... vì vậy nó rất tốt ở đây. Cảm ơn sự đánh giá cao của bạn. – dyoser

6

Bạn có thể sử dụng urllib.unquote

+0

khi tôi sử dụng unquote (cảm ơn bằng cách này ...) nó cho thấy chuỗi này http: //sample.com/index.php? Title = \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 & action = edi và tôi biết chúng là những ký tự Trung Quốc ... làm thế nào tôi có thể nhìn thấy chúng? Tôi đoán đây là unicode, phải không? – dyoser

+0

Đó là câu hỏi của bạn rồi. Đó là các byte UTF-8; bạn có thể chuyển đổi chúng thành chuỗi Unicode với 'b '\ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5" .decode ("utf-8") '(sử dụng cú pháp Python hiện đại hơn một chút). – 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

Tại sao bạn lại sử dụng regex và lambdas theo cách thủ công khi có thư viện được xây dựng trong đó thực hiện những gì bạn cần, có thể thậm chí còn chu đáo hơn? –

+4

Giải pháp tuyệt vời! 'urllib2' không phải là một phần của distri python chuẩn. 're' là. – cxxl

9

hoặc 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

Và nếu bạn đang sử dụng Python3 bạn có thể sử dụng:

urllib.parse.unquote(url) 
+0

Cũng trong 'urllib.request.unquote' – Ben