Url giải mã UTF-8 bằng Python


245

Tôi đã dành nhiều thời gian cho đến khi tôi là người mới chơi Python.
Làm thế nào tôi có thể giải mã một URL như vậy:

example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0

đến cái này trong python 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) đang trả lại một cái gì đó rất xấu xí.

Vẫn không có giải pháp, bất kỳ trợ giúp được đánh giá cao.


2
Trong trường hợp chung, phần đuôi của URL chỉ là một cookie. Bạn không thể biết bộ mã hóa ký tự cục bộ nào mà máy chủ sử dụng hoặc thậm chí liệu URL có mã hóa chuỗi hay thứ gì đó hoàn toàn khác không. (Cấp, nhiều URL làm mã hóa một chuỗi con người có thể đọc được; và thường xuyên, bạn có thể đoán mã hóa rất dễ dàng Nhưng nó không thể thực hiện trong trường hợp thông thường hoặc hoàn toàn tự động..)
tripleee

Câu trả lời:


398

Dữ liệu là các byte được mã hóa UTF-8 được thoát bằng trích dẫn URL, do đó bạn muốn giải mã , với urllib.parse.unquote(), xử lý việc giải mã từ dữ liệu được mã hóa theo phần trăm sang byte UTF-8 và sau đó thành văn bản, trong suốt:

from urllib.parse import unquote

url = unquote(url)

Bản giới thiệu:

>>> from urllib.parse import unquote
>>> url = 'example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0'
>>> unquote(url)
'example.com?title=правовая+защита'

Tương đương Python 2 là urllib.unquote(), nhưng điều này trả về một bytestring, vì vậy bạn phải giải mã thủ công:

from urllib import unquote

url = unquote(url).decode('utf8')

Vậy tại sao ký tự + còn lại trong chuỗi? Tôi nghĩ rằng% 2B là ký tự + và + nghĩa đen đã bị xóa trong quá trình giải mã?
AlexLordThorsen

5
@Rawrgulmuffins +là một khoảng trống trong x-www-form-urlencodeddữ liệu ; bạn sẽ sử dụng urllib.parse.parse_qs()để phân tích cái đó hoặc sử dụng urllib.parse.unquote_plus(). Nhưng chúng chỉ nên xuất hiện trong chuỗi truy vấn, không phải phần còn lại của URL.
Martijn Pieters

140

Nếu bạn đang sử dụng Python 3, bạn có thể sử dụng urllib.parse

url = """example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0"""

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

cho:

'example.com?title=правовая+защита'

sử dụng điều này và nhận một lệnh thay vì chuỗi truy vấn trên python3.8
Clocker
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.