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.


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')

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

menggunakan ini dan mendapatkan dict alih-alih string kueri di python3.8
Clocker
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.