URLのエスケープ文字をデコードします


83

エスケープ文字を含むURLを含むリストがあります。これらの文字はurllib2.urlopen、htmlページを回復するときに設定されています。

http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=edit
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=history
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&variant=zh 

それらをPythonでエスケープされていない形式に戻す方法はありますか?

PS:URLはutf-8でエンコードされています

回答:


144

公式ドキュメント。

urllib.unquote(ストリング)

%xxエスケープを同等の1文字に置き換えます。

例:unquote('/%7Econnolly/')yields '/~connolly/'

そして、デコードするだけです。


更新: Python 3の場合、次のように記述します。

import urllib.parse
urllib.parse.unquote(url)

Python3のドキュメント。


上で述べたように、引用符がないことは、sample.com / index.php?title = \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5&action = edi ...この場合は自分自身をうまく説明できなかったかもしれません...しかしurlは中国語のもので、引用符で囲まれていない文字ではなく、元の文字にデコードしたい
Tony

3
@dyoserこれを質問に入れる必要があります。
クリスハーパー

@ root45これは1つの答えへのコメントです...だから、ここでそれは正しいです。感謝します。
トニー

11
python3の場合、これはurllib.parse.unquote
tayfun

4
python3の場合は、次の場所にもありますurllib.request.unquote
Ben


11

または urllib.unquote_plus

>>> import urllib
>>> urllib.unquote('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29')
'erythrocyte+membrane+protein+1,+PfEMP1+(VAR)'
>>> urllib.unquote_plus('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29')
'erythrocyte membrane protein 1, PfEMP1 (VAR)'

7

使用できます urllib.unquote


unquoteを使用すると(ちなみにありがとう...)、この文字列sample.com/index.php?title= \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5&action = ediが表示され、漢字であることがわかります...どうすればそれらを見ることができますか?これはユニコードだと思いますよね?
トニー

それはすでにあなたの質問にあります。これらはUTF-8バイトです。これらをUnicode文字列に変換できb"\xe9\xa6\x96\xe9\xa1\xb5".decode("utf-8")ます(現在は少し新しいPython構文を使用しています)。
トリプリー2017

5
import re

def unquote(url):
  return re.compile('%([0-9a-fA-F]{2})',re.M).sub(lambda m: chr(int(m.group(1),16)), url)

8
必要なことを実行する組み込みライブラリがあるのに、なぜ手動で正規表現とラムダを使用するのでしょうか。
ブラッドコッホ

6
クールな解決策!urllib2標準のPythonディストリビューションの一部ではありません。 reです。
cxxl 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.