2013-06-29 19 views
6

DÜZENLEME: Problemi çözdüm. #user_sex'te #, python istekleri tarafından% 23'e dönüştürülüyor. Python isteklerini #% 23'e dönüştürmeye zorlamanın bir yolu var mı yoksa sadece bu bölümü kodlamalı mıyım?Python, urlencode istemiyor mu?

Bir facebook fql multiquery yapmaya çalışıyorum. Ben

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 
) 

altına fql_url kullanıp requests.get (fql_url) çalıştırdığınızda ben kodu bu

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 
) 

her şey gibi fql_url teslim ederken, döndürülen json Ancak

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

olduğunu çalışır (json istenen verilere sahiptir).

Hem ilk fql_url hem de el kodlu fql_url kodlamasını karşılaştırdım ve her ikisi de jsonu almak için aynı url kullanılmasına neden olmalıdır. Urlencode istekleri çalışmıyor mu, yoksa yanlış bir şey mi yapıyorum?

cevap

12

sorundur, # gerçekten bir URL'de geçerli bir karakter olduğunu. Parça parçasını gösterir. Parça, her zaman alıcı tarafından çözüldüğü için sunucuya asla gönderilmez. Bu deneyebilirsiniz:

Gördüğünüz gibi, URL'nin son bölümü sona erdi
>>> import urllib3 
>>> urllib3.util.parse_url(fql_url) 
Url(scheme='https', auth=None, host='graph.facebook.com', port=None, path='/fql', 
    query='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 ', 
    fragment='user_sex)) ORDER BY name"}') 

fragmanı halinde ayrıştırılmıyordur.

Düzenleme:

en uygun yol muhtemelen istekleri tüm kodlama yapalım olacaktır.

import requests 
s = requests.Session() 
s.params = {'access_token': 'foobarbaz'} # so you don't have to specify it every time 
query = ('{"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"}') 
s.get('https://graph.facebook.com/fql', params={'q': query}) 
+0

Bu mantıklı. Yani temel olarak ilk fql_url kullanmalı ve #% 23 ile # yerine almalı mıyım yoksa bunu yapmak için daha geleneksel bir yol var mı? – bab

+1

Bana cevap vermenin pragmatik yolunu ekledim –

3

urlopen aramanızdan önce urllib.quote() kullanın.

  1. düzgün o %23 içine # kodlamak gibi görünüyor urllib.urlencode kullanıyorsanız.
  2. Hiçbir zaman geçerli olmayan karakterlerle takılırsanız, alıntı yapın (ve '+' yazmanız gerekiyorsa, quote_plus kullanın).
  3. Hep komut satırına deneyebilirsiniz:

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

Not # o ->%23

+0

Bu işe yarıyor ama neden onu aramam gerekiyor? İstekler zaten dönüşümle ilgilenmiyor mu? – bab

+0

Eğer urllib.urlencode düzgün bir şekilde kullanılıyorsa, #% 23'e kodlanmış gibi görünüyor; ama bu kod burada olmadığı için, nereden geldiğini anlayamadım. Geçerli olmayan karakterlerle takılmamışsanız, alıntı yapın (ve '+' yazmanız gerekiyorsa, quote_plus kullanın). Komut satırında her zaman deneyebilirsiniz: >>> d = {'e': 'e^& * F ##'} >>> urllib.urlencode (d) 'e = e% 5E% 26 % 2AF% 23% 23 ' Not: # ->% 23 –

+1

Tamam teşekkürler, bunu şimdilik kullanacağım. Ancak taleplerin neden doğru bir şekilde kodlamadığını biliyor musunuz? Bu benim bahsettiğim kütüphane. http: // docs.python-requests.org/en/latest/ – bab

İlgili konular