PythonでのURLデコードUTF-8


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

これをPython 2.7で: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) 非常に醜いものを返しています。

それでも解決策はありません、どんな助けもありがたいです。


2
一般的なケースでは、URLの末尾は単なるCookieです。サーバーが使用するローカル文字セットエンコーディングや、URLが文字列などまったく異なるものをエンコードしているかどうかはわかりません。(当然のことながら、多くのURL 人間が読み取れる文字列をエンコードします。多くの場合、エンコードは非常に簡単に推測できます。ただし、一般的に、または完全に自動的にそれを行うことはできません。)
tripleee

回答:


398

データはURL引用符でエスケープされたUTF-8エンコードされたバイトです。したがって、パーセントエンコードされたデータからUTF-8バイトへ、次にテキストへのデコードをurllib.parse.unquote()透過的に処理するwith をデコードします。

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 2014年

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

これを使用してpython3.8上の辞書の代わりに、クエリ文字列を取得
Clocker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.