Url ถอดรหัส UTF-8 ใน Python


245

ฉันใช้เวลาไปมากพอ ๆ กับที่ฉันเพิ่งสมัครเป็น Python
ฉันจะถอดรหัส 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

หนึ่งในนี้ในหลาม 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) กำลังคืนสิ่งที่น่าเกลียดมาก

ยังไม่มีวิธีแก้ปัญหาใด ๆ ที่เป็นที่นิยม


2
ในกรณีทั่วไปหางของ URL เป็นเพียงคุกกี้ คุณไม่สามารถรู้ได้ว่าการเข้ารหัสชุดอักขระท้องถิ่นที่เซิร์ฟเวอร์ใช้หรือไม่ว่า URL เข้ารหัสสตริงหรืออะไรที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (ที่ได้รับ URL มากทำเข้ารหัสสตริงมนุษย์สามารถอ่านได้และมักจะคุณสามารถคาดเดาการเข้ารหัสได้อย่างง่ายดายมาก แต่มันเป็นไปไม่ได้ในกรณีทั่วไปหรือสมบูรณ์โดยอัตโนมัติ..)
tripleee

คำตอบ:


398

ข้อมูลเป็น UTF-8 ที่เข้ารหัสแล้วไบต์ที่มีการอ้างอิง URL ดังนั้นคุณต้องการถอดรหัสด้วยurllib.parse.unquote()ซึ่งจัดการการถอดรหัสจากข้อมูลที่เข้ารหัสเป็นเปอร์เซ็นต์ไปเป็น UTF-8 ไบต์และจากนั้นเป็นข้อความโปร่งใส:

from urllib.parse import unquote

url = unquote(url)

การสาธิต:

>>> 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 ที่เทียบเท่ากันurllib.unquote()แต่จะคืนค่าการทดสอบดังนั้นคุณต้องถอดรหัสด้วยตนเอง:

from urllib import unquote

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

เหตุใดอักขระ + จึงเหลืออยู่ในสตริง ฉันคิดว่า% 2B เป็นตัวละคร + และ + ตัวอักษรถูกลบออกระหว่างการถอดรหัส?
AlexLordThorsen

5
@Rawrgulmuffins +พื้นที่ในx-www-form-urlencodedข้อมูล ; คุณต้องการใช้ที่จะแยกว่าหรือการใช้งานurllib.parse.parse_qs() urllib.parse.unquote_plus()แต่ควรปรากฏในสตริงข้อความค้นหาไม่ใช่ส่วนที่เหลือของ URL
Martijn Pieters

140

หากคุณใช้ Python 3 คุณสามารถใช้ 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)

ให้:

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

ใช้สิ่งนี้และรับ dict แทนสตริงการสืบค้นใน python3.8
Clocker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.