Giải mã các ký tự thoát trong URL


83

Tôi có một danh sách chứa các URL có các ký tự thoát trong đó. Các ký tự đó đã được đặt urllib2.urlopenkhi nó khôi phục trang 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 

Có cách nào để biến chúng trở lại dạng không thoát trong python không?

Tái bút: Các URL được mã hóa bằng utf-8

Câu trả lời:


144

Tài liệu chính thức.

urllib.unquote(chuỗi)

Thay thế các %xxlối thoát bằng ký tự tương đương của chúng.

Ví dụ: hoa unquote('/%7Econnolly/')lợi '/~connolly/'.

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


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

import urllib.parse
urllib.parse.unquote(url)

Tài liệu Python 3.


phần trích dẫn hiển thị 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 rõ về mình trong trường hợp này ... nhưng url là một Trung Quốc và tôi muốn giải mã để nó gốc char, không phải là người unquote
Tony

3
@dyoser Bạn cần đặt điều này trong câu hỏi của mình.
Kris Harper

@ root45 đây là một nhận xét cho một câu trả lời ... vì vậy nó đúng ở đây. Cảm ơn vì sự đánh giá cao của bạn.
Tony

11
Chỉ cần một lưu ý rằng cho python3, đây làurllib.parse.unquote
Tayfun

4
Đối với python3, nó cũng có trongurllib.request.unquote
Ben

30

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

import urllib.parse
urllib.parse.unquote(url)

Cũng trongurllib.request.unquote
Ben

11

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

Bạn có thể dùng urllib.unquote


khi tôi sử dụng unquote (nhờ bằng cách này ...) nó cho thấy chuỗi này sample.com/index.php?title= \ xe9 \ xa6 \ x96 \ xe9 \ XA1 \ xb5 & action = edi và tôi biết họ chars Trung Quốc đang ... 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?
Tony

Đó 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 một 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 hiện nay).
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
Tại sao bạn lại sử dụng thủ công regex và lambdas khi có một thư viện tích hợp sẵn có những thứ bạn cần, thậm chí có thể chu đáo hơn?
Brad Koch

6
Giải pháp mát mẻ! urllib2không phải là một phần của phân phối python tiêu chuẩn. reLà.
cxxl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.