Python demandes urlencode pas de travail?
EDIT: j'ai compris le problème. Le # dans #user_sex n'est pas en cours de conversion à l' %23 par python demandes. Est-il un moyen de la force python demandes de conversion de # de %23 ou je vais juste avoir à la main le code de la partie?
Je suis en train de faire un facebook fql multiquery. Lorsque j'utilise le fql_url ci-dessous
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
)
et d'exécuter des requêtes.get(fql_url), le json retourné est
{u'error': {
u'code': 601,
u'message': u"(#601) Parser error: unexpected '{' at position 0.",
u'type': u'OAuthException'}
}
Cependant, quand je part le code de la fql_url que ce
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
)
tout fonctionne (le json a les données souhaitées).
J'ai comparé les deux le premier fql_url et la main codé fql_url, et les deux devraient entraîner dans la même url utilisée pour obtenir le json. Le sujet des demandes urlencode pas de travail ou suis-je en train de faire quelque chose de mal ici?
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que
#
est en effet un caractère valide dans une URL. Il indique le fragment de la partie.Comme le fragment est toujours résolu par le useragent il n'est jamais envoyé au serveur.
Vous pouvez essayer ceci:
Comme vous pouvez le voir, la dernière partie de votre URL a fini par être analysée comme le fragment.
Edit:
Le moyen le plus pratique serait probablement pour laisser demandes de faire tout le codage.
Utilisation
urllib.quote()
avant votreurlopen
appel.urllib.urlencode
correctement, il ne semble pas coder#
en%23
.$ d={'e':'e^&*F##'}
$ urllib.urlencode(d)
-> 'e=e%5E%26%2AF%23%23'
Noter que
#
->%23