2017-03-22 5 views
0

は、私は括弧を置換するPythonスクリプトを記述しようとしています修飾:PythonのDjangoのURLブラケットが

( - >%28
) - >%29

は、私が発見したPythonでDjangoのモジュールiri_to_uri関数を使ってこれを行うことができます。たとえば、私はhttps://example.com/pat%28da35dd40%29/index.htmlhttps://example.com/pat(da35dd40)/index.htmlを変換したいが、何らかの理由で私のスクリプトは動作しません:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from django.utils.encoding import iri_to_uri 

print uri_to_iri(https://example.com/pat(da35dd40)/index.html) 

をそして、私はそれがブラケットを変換しません引用符の中にURLを入れる場合には、無効な構文を報告します。このスクリプトは、ユーザーからの入力を処理し、すべての特殊文字をエスケープして、スクリプトを他のプロセスで処理できるようにするという究極の目標です。

+3

はい、明らかに、そのようなものは文字列でなければならないため無効な構文です。 –

+0

私は熟練者ではありませんが、Djangoは括弧が大丈夫と思われます。私は、RFC 3987がそう言っていると仮定します。そうでなければ、Djangoにバグ報告を送ることができます。スペースを追加しようとすると、 'iri_to_uri'が期待どおりに動作することがわかります。 – MariusSiuram

答えて

1

quoteurllibからお試しください。 URLを安全に渡すことができます。

ちょっと注意して、http://を保存して、プロトコルなしでのみURLを解析してください。 (これを思い出させるための@MariusSiuramに感謝します)

+1

は正しいですが、注意してください!プロトコル部分は個別に考慮する必要があります(つまり、完全なhttps://example.com/pat.../を 'quote 'しようとせず、代わりに' example.com/pat ... 'を使うか、単純に'/ pat ...'。 – MariusSiuram

+0

@MariusSiuram問題は、URL全体を解析すると、 ':'を '%3A'に転写するので、完全なリンクは' https%3A // example.com/pat% 'https:// example.com/pat%28da35dd40%29/index.html'の代わりに28da35dd40%29/index.html'と書いてあります。 –

+0

彼が言っていたように、あなたは' http:// ' –

-1

@FernandoCezarのおかげで、私は解決策を見つけました。以下のコードは、安全の後に定義された文字を解釈しないため、リンクを正しく変換します:urllib.quote('https://example.com/pat(da35dd40)/index.html', safe=':''/')

+0

しかし、これは 'http://example.com/pat(28:34)/ index.html'のようなURLでは失敗します。その意味ではあまり一般的ではありません。 – MariusSiuram

+0

@MariusSiuram私は、文字列をリストに変換し、最初の8つの要素を無視し、9番目のcharからurllib.quoteを適用することをお勧めします。 o nwards。これも最適な解決策ではありません。 –