Python-requests urlencode funktioniert nicht?
EDIT: ich habe herausgefunden, das problem. Die # in #user_sex nicht konvertieren zu %23 von python-requests. Gibt es eine Möglichkeit zu zwingen, python-Anforderungen zu konvertieren # %23 oder werde ich gerade zur hand haben-code, Teil?
Ich versuche, mich ein facebook fql multiquery. Wenn ich den fql_url unten
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
)
und ausführen von Anfragen.bekommen(fql_url), die json zurückgegeben wird
{u'error': {
u'code': 601,
u'message': u"(#601) Parser error: unexpected '{' at position 0.",
u'type': u'OAuthException'}
}
Allerdings, wenn ich hand-code der fql_url als diese
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
)
alles funktioniert (die json hat den gewünschten Daten).
Habe ich gegenüber der ersten fql_url und der hand codiert, fql_url und beide sollte die gleiche url verwendet, um die json. Die Anforderungen urlencode funktioniert nicht oder mache ich etwas falsch hier?
InformationsquelleAutor bab | 2013-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
#
ist in der Tat ein gültiges Zeichen in einer URL. Es bezeichnet das fragment Teil.Als das fragment ist immer gelöst, indem Sie die useragent-es ist nie an den server gesendet.
Sie können versuchen, diese:
Wie Sie sehen können, der Letzte Teil des URL wurde analysiert, wie das fragment.
Edit:
Der bequemste Weg, würde es wahrscheinlich sein lassen Anfragen, die haben alle die Codierung.
Ich habe den pragmatischen Weg zu mir beantworten
InformationsquelleAutor t-8ch
Verwenden
urllib.quote()
vor Ihrerurlopen
nennen.urllib.urlencode
richtig, es scheint zu Kodieren#
in%23
.$ d={'e':'e^&*F##'}
$ urllib.urlencode(d)
-> 'e=e%5E%26%2AF%23%23'
Beachten Sie, dass
#
->%23
Wenn Sie das urllib.urlencode richtig, es scheint zu Kodieren # in %23; aber da dieser code nicht da war, konnte ich nicht sagen, wo Sie Fehler kommt. Wenn Sie jemals stecken, mit Zeichen, die nicht gültig ist, zitieren Sie Sie (und wenn Sie brauchen, um zu zitieren,'+', verwenden Sie quote_plus). Sie können immer versuchen Sie es in der Befehlszeile: >>> d={'e':'e^&*F##'} " >>> das urllib.urlencode(d) 'e=e%5E%26%2AF%23%23' Beachten Sie, dass # -> %23
Ok danke ich werde es verwenden, für jetzt. Aber wissen Sie, warum fordert nicht die Kodierung ist richtig? Dies ist die Bibliothek, die ich mich beziehe. docs.python-requests.org/en/latest
Ich stehe vor demselben Problem. Hast du eine Lösung für dieses?
InformationsquelleAutor Pierre-Francoys Brousseau