2013-06-29 7 views
6

संपादित करें: मुझे समस्या का पता चला। #user_sex में # पाइथन अनुरोधों द्वारा% 23 में परिवर्तित नहीं किया जा रहा है। क्या # से% 23 को परिवर्तित करने के लिए पाइथन अनुरोधों को बल देने का कोई तरीका है या क्या मुझे बस उस हिस्से को कोड सौंपना होगा?पायथन अनुरोध करता है कि urlencode काम नहीं कर रहा है?

मैं एक फेसबुक fql multiquery बनाने की कोशिश कर रहा हूँ। जब मैं नीचे

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 
) 

fql_url का उपयोग करें और 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 = (
    '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 
) 

सब कुछ के रूप में fql_url है काम करता है (जेसन वांछित डेटा है)।

मैंने पहले fql_url और हाथ कोडित fql_url दोनों की तुलना की है और दोनों को जेसन प्राप्त करने के लिए उसी यूआरएल का उपयोग किया जाना चाहिए। अनुरोध urlencode काम नहीं कर रहा है या क्या मैं यहाँ कुछ गलत कर रहा हूँ?

उत्तर

12

समस्या है, कि # वास्तव में एक URL में मान्य वर्ण नहीं है। यह खंड भाग को दर्शाता है। चूंकि टुकड़ा हमेशा उपयोगकर्ता द्वारा हल किया जाता है, यह सर्वर पर कभी नहीं भेजा जाता है। आप इस कोशिश कर सकते हैं:

>>> 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"}') 

आप देख सकते हैं, अपने यूआरएल के अंतिम भाग को समाप्त टुकड़ा के रूप में पार्स किया जाता।

संपादित करें:

सबसे सुविधाजनक तरीका शायद अनुरोध सभी एन्कोडिंग करते हैं करने के लिए किया जाएगा।

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

यह समझ में आता है। तो मूल रूप से मुझे पहले fql_url का उपयोग करना चाहिए और बस # 23 के साथ # को प्रतिस्थापित करना चाहिए या ऐसा करने के लिए एक और पारंपरिक तरीका है? – bab

+1

मैंने जवाब देने के लिए व्यावहारिक तरीका जोड़ा –

3

अपने urlopen कॉल से पहले urllib.quote() का उपयोग करें।

  1. आप urllib.urlencode उपयोग कर रहे हैं ठीक से यह %23 में # एन्कोड करने के लिए प्रतीत होता है।
  2. यदि आप कभी भी पात्रों के साथ अटक गए हैं जो मान्य नहीं हैं, तो उन्हें उद्धृत करें (और यदि आपको '+' उद्धृत करने की आवश्यकता है, तो quote_plus का उपयोग करें)।
  3. तुम हमेशा आदेश पंक्ति पर कोशिश कर सकते हैं:

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

नोट # कि ->%23

+0

यह काम करता है लेकिन मुझे इसे कॉल करने की आवश्यकता क्यों है? अनुरोध पहले से ही रूपांतरण संभाल नहीं है? – bab

+0

यदि आप urllib.urlencode का उपयोग कर रहे हैं तो यह # 23 में एन्कोड करने लगता है; लेकिन चूंकि वह कोड यहां नहीं था, इसलिए मैं यह नहीं बता सका कि आप कहां से गलती करते हैं। यदि आप कभी भी ऐसे पात्रों से फंस गए हैं जो मान्य नहीं हैं, तो उन्हें उद्धृत करें (और यदि आपको '+' उद्धृत करने की आवश्यकता है, तो quote_plus का उपयोग करें)। आप हमेशा कमांड लाइन पर कोशिश कर सकते हैं: >>> डी = {'ई': 'ई^और * एफ ##'} >>> urllib.urlencode (डी) 'ई = ई% 5 ई% 26 % 2AF% 23% 23 ' ध्यान दें कि # ->% 23 –

+1

ठीक है धन्यवाद, मैं अभी इसका उपयोग करूंगा। लेकिन क्या आप जानते हैं कि अनुरोध सही तरीके से एन्कोडिंग क्यों नहीं कर रहे हैं? यह वह लाइब्रेरी है जिसका मैं जिक्र कर रहा हूं। http: // डॉक्स।python-requests.org/en/latest/ – bab

संबंधित मुद्दे