URLからパラメーターを取得する


164

次のようなURLがある場合、クエリパラメータの値を解析するにはどうすればよいですか?たとえば、この場合はの値が必要ですdef

/abc?def='ghi'

私の環境ではDjangoを使用しています。request私を助けることができるオブジェクトのメソッドはありますか?

使ってみましたが思っself.request.get('def')た通りの値が返ってきませんghi

回答:


255

Python 2:

import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']

Python 3:

import urllib.parse as urlparse
from urllib.parse import parse_qs
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(parse_qs(parsed.query)['def'])

parse_qs値のリストを返すため、上記のコードはを出力します['ghi']

これがPython 3のドキュメントです。


58
python3でimport urllib.parse as urlparse
Ivan De Paz

26
parse_qsはリストオブジェクトを返すことに注意してください。文字列が必要な場合は、最初の要素を取得する必要がありますurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
urlに次のような「#」文字が含まれている場合:foo.appspot.com/ #/ abc?def=ghi、フラグメントを禁止する必要があることに注意してくださいurlparse(url, allow_fragments=False)。そうしないと、クエリは空のstrを返します。
codezjx 2017

2
python3では、from urllib.parse import urlparse, parse_qsandを使用する必要がありますparse_qs(parsed.query)
deathemperor

1
@FrancescoFrassinelliそれは有効です。urlparse.urlparse(url)->urlparse(url)
Winand

55

このソリューションはまだここにないのでショックです。使用する:

request.GET.get('variable_name')

これにより、「GET」ディクショナリから変数が「取得」され、存在する場合は「variable_name」値が、存在しない場合はNoneオブジェクトが返されます。


3
これが一番の答えになるはずです。魅力のように機能します。
muntasir2000 2017

2
私は辞めなければなりませんでしたselfが、上記のコメントに同意します。
Matt Cremeens 2017

これを機能させることができません。多分もう少し詳細。どのようにリクエストを受け取っていますか?これはpython3互換ですか?
-ggedde

3
@ggeddeこの質問は(質問と同じように)django用で、djangoリクエストオブジェクトです。djangoを使用していない場合は、他の回答のいずれかを使用してください。
フロリアン

55
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)

print par['q'][0], par['p'][0]

46

Python> 3.4の場合

from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]

4
IMOを行うための最良の方法。追加のパッケージは必要なく、Python 3.5でA +で動作します。
wanaryytel 2017

22

furlという新しいライブラリがあります。このライブラリは、URL代数を実行するための最もpythonicであることがわかります。インストールするには:

pip install furl

コード:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']

3
素晴らしい図書館!それについては知りませんでしたが、魅力のように機能します:)
pasql

3
:)私はurlparseを私のために動作させるために費やす時間を無駄にしました。もういや。
Mayank Jaiswal

18

少し遅れていることは知っていますが、今日ここにいるので、他の人に役立つ答えだと思いました。

import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
    print "Parameter = "+x,"Value = "+y

parse_qsl()では、「データは名前と値のペアのリストとして返されます。」


5

あなたが参照しているURLはクエリタイプであり、リクエストオブジェクトはクエリ引数を取得するための引数と呼ばれるメソッドをサポートしていることがわかりました。self.request.get('def')オブジェクトから値を直接取得することもできます。


3
def getParams(url):
    params = url.split("?")[1]
    params = params.split('=')
    pairs = zip(params[0::2], params[1::2])
    answer = dict((k,v) for k,v in pairs)

お役に立てれば


これは、webapp内では必要ありません。
Nick Johnson、


3

それをする必要はありません。とのみ

self.request.get('variable_name')

メソッド(GET、POSTなど)を指定していないことに注意してください。これは十分に文書化されており、これは例です

Djangoテンプレートを使用しても、ハンドラーがDjangoによって処理されるわけではありません


3

純粋なPythonでは:

def get_param_from_url(url, param_name):
    return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]

2
import cgitb
cgitb.enable()

import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i

0

ところで、parse_qs()を使用して空の値パラメーターを取得する際に問題があり、2番目のオプションパラメーター 'keep_blank_values'を渡して、値を含まないクエリ文字列のパラメーターのリストを返す必要があることを学びました。デフォルトはfalseです。一部の安っぽいAPIは、値が含まれていなくてもパラメーターが存在する必要があります

for k,v in urlparse.parse_qs(p.query, True).items():
  print k

0

素敵なライブラリw3lib.urlがあります

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi

0

パラメータ= dict([part.split( '=')for part in get_parsed_url [4] .split( '&')])

これは簡単です。可変パラメーターには、すべてのパラメーターのディクショナリーが含まれます。


0

トルネードのユーザーには答えがないようです:

key = self.request.query_arguments.get("key", None)

このメソッドは、以下から派生するハンドラー内で機能する必要があります。

tornado.web.RequestHandler

要求されたキーが見つからない場合、このメソッドが返す答えはありません。これにより、いくつかの例外処理が節約されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.