Url decode UTF-8 dengan Python

245

Saya telah menghabiskan banyak waktu sejauh saya pemula di Python.
Bagaimana saya bisa memecahkan kode URL seperti itu:

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

untuk yang ini di python 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) adalah mengembalikan sesuatu yang sangat jelek.

Masih tidak ada solusi, bantuan apa pun dihargai.

pemegang pedang
sumber
2
Dalam kasus umum, ujung URL hanyalah cookie. Anda tidak dapat mengetahui set karakter lokal mana yang digunakan oleh server atau bahkan apakah URL menyandikan string atau sesuatu yang sama sekali berbeda. (Memang, banyak URL yang menyandikan string yang dapat dibaca oleh manusia; dan seringkali, Anda dapat menebak penyandian dengan sangat mudah. ​​Tetapi itu tidak mungkin dalam kasus umum atau sepenuhnya otomatis.)
tripleee

Jawaban:

398

Data adalah byte yang disandikan UTF-8 yang lolos dengan kutipan URL, sehingga Anda ingin men - decode , dengan urllib.parse.unquote(), yang menangani decoding dari data yang disandikan pada persen ke UTF-8 byte dan kemudian ke teks, secara transparan:

from urllib.parse import unquote

url = unquote(url)

Demo:

>>> 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=правовая+защита'

Setara dengan Python 2 adalah urllib.unquote(), tetapi ini mengembalikan bytestring, jadi Anda harus mendekode secara manual:

from urllib import unquote

url = unquote(url).decode('utf8')
Martijn Pieters
sumber
Jadi mengapa karakter + tersisa di string? Saya pikir% 2B adalah karakter + dan literal telah dihapus selama decoding?
AlexLordThorsen
5
@Rawrgulmuffins +adalah ruang dalam x-www-form-urlencodeddata ; Anda akan menggunakannya urllib.parse.parse_qs()untuk menguraikannya, atau menggunakannya urllib.parse.unquote_plus(). Tetapi mereka hanya akan muncul di string kueri, bukan bagian URL lainnya.
Martijn Pieters
140

Jika Anda menggunakan Python 3, Anda bisa menggunakan 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)

memberi:

'example.com?title=правовая+защита'
pavan
sumber
menggunakan ini dan mendapatkan dict alih-alih string kueri di python3.8
Clocker