Url, Python'da UTF-8 kodunu çözüyor


245

Python'da acemi olduğum kadar çok zaman geçirdim.
Böyle bir URL'nin kodunu nasıl çözebilirim:

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

Python 2.7'de buna: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) çok çirkin bir şey döndürüyor.

Hala çözüm yok, herhangi bir yardım takdir ediliyor.


2
Genel durumda, bir URL'nin kuyruğu sadece bir çerezdir. Sunucunun hangi yerel karakter kümesi kodlamasını kullandığını veya URL'nin bir dizeyi veya tamamen farklı bir şeyi kodlayıp kodlamadığını bilemezsiniz. (Verilen, birçok URL yapmak kodluyor okunabilecek şekilde dize ve genellikle çok kolay kodlama tahmin edebilirsiniz Ama genellikle durumunda veya tamamen otomatik olarak mümkün değildir..)
tripleee

Yanıtlar:


398

Veri istediğiniz böylece UTF-8 kodlu byte, URL alıntı ile kaçan olan kod çözme ile, urllib.parse.unquote()hangi şeffaf, UTF-8 bayt ve daha sonra metne yüzde olarak kodlanmış verilerden deşifre kolları:

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

Python 2 eşdeğeri urllib.unquote(), ancak bu bir bytestring döndürür, bu nedenle manuel olarak kod çözmeniz gerekir:

from urllib import unquote

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

Peki + karakteri neden dizgide bırakılıyor? Kod çözme sırasında% 2B'nin + karakteri olduğunu ve + değişmezlerinin kaldırıldığını mı düşündüm?
AlexLordThorsen

5
@Rawrgulmuffins verilerde+ bir alandır ; bunu ayrıştırmak veya kullanmak için kullanabilirsiniz . Ancak URL'nin geri kalanında değil, yalnızca sorgu dizesinde görünmelidir. x-www-form-urlencodedurllib.parse.parse_qs()urllib.parse.unquote_plus()
Martijn Pieters

140

Python 3 kullanıyorsanız, 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)

verir:

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

kullanarak ve python3.8 üzerinde sorgu dizesi yerine bir diksiyon almak
Clocker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.