6

編集:私は問題を理解しました。#user_sex の # は、Python リクエストによって %23 に変換されていません。Pythonリクエストを強制的に変換する方法はありますか?

Facebookのfqlマルチクエリを作成しようとしています。以下の fql_url を使用すると

fql_url = (
    'https://graph.facebook.com/fql?q='
    '{"user_sex":"SELECT sex FROM user WHERE uid=me()",'
    '"friends":"SELECT uid, name FROM user WHERE uid IN '
    '(SELECT uid2 FROM friend WHERE uid1 = me()) '
    'AND not (sex in (SELECT sex FROM #user_sex)) '
    ' ORDER BY name"}'
    '&access_token='+access_token
)

requests.get(fql_url) を実行すると、返される json は

{u'error': {
    u'code': 601,
    u'message': u"(#601) Parser error: unexpected '{' at position 0.",
    u'type': u'OAuthException'}
}

ただし、fql_url をこのようにハンドコーディングすると

fql_url = (
    'https://graph.facebook.com/fql?q=%7B%22'
    'user_sex%22:%22SELECT%20sex%20FROM%20user%20WHERE%20uid=me()%22,%22'
    'friends%22:%22SELECT%20uid,%20name%20FROM%20user%20WHERE%20uid%20IN%20'
    '(SELECT%20uid2%20FROM%20friend%20WHERE%20uid1%20=%20me())%20'
    'AND%20not%20(sex%20in%20(select%20sex%20from%20%23user_sex))%20%20'
    'ORDER%20BY%20name%22%7D&'
    'access_token='+access_token
)

すべてが機能します(jsonには目的のデータがあります)。

最初の fql_url と手動でコーディングされた fql_url の両方を比較しましたが、どちらも json を取得するために使用される同じ URL になるはずです。リクエストの urlencode が機能していませんか、それともここで何か間違っていますか?

4

2 に答える 2

3

お電話urllib.quote()の前にご利用ください。urlopen

  1. 適切に使用している場合はurllib.urlencode、にエンコード#されているようです%23
  2. 無効な文字に行き詰まった場合は、それらを引用してください (「+」を引用する必要がある場合は、quote_plus を使用してください)。
  3. コマンドラインでいつでも試すことができます:

$ d={'e':'e^&*F##'} $ urllib.urlencode(d) -> 'e=e%5E%26%2AF%23%23'

注意してください#- >%23

于 2013-06-29T01:01:15.540 に答える