2017-04-04 2 views
-1

J'utilise une commande requests.get pour récupérer des données à partir d'un point final URL/REST. Les données sont supposées être au format JSON. Quand j'accède à l'URL à partir d'un navigateur, il a le formatage que vous attendez, à savoir [{"variable1":value,"variable2":value}]. Toutefois, lorsque j'utilise la commande requests.get pour récupérer les données, les données renvoyées sont décomposées et incluent des lignes de valeurs supplémentaires, qui semblent être des hexadécimaux représentant le nombre de caractères de la ligne suivante. Voici un exemple de ce que response.text renvoie.Python Requests.Get réponse inclut des valeurs inattendues

2000 

[{"variable1":v 

2000 

alue,"variable2 

1ecd 

":value}] 

0 

2000 base 16 = 8192 base 10, ce qui signifie qu'il y a 8 192 caractères sur la ligne suivante. Notez que dans l'exemple ci-dessus, j'ai intentionnellement raccourci les lignes pour ne pas montrer 8 192 caractères :).

Inutile de dire que cela ne respecte pas le format JSON, donc je ne peux pas le traiter comme prévu. Des pensées sur pourquoi cela peut se produire? Je pense qu'il était que peut-être quelque chose à voir avec la taille de la réponse reçue - len(response.content) indique qu'il est 335,898 octets de taille - alors j'ai essayé Chunking la réponse comme décrit here, mais cela n'a pas affecté la production de response.text. Appréciez les gens peuvent partager des pensées :)

EDIT1: Running print(response.json()) donne l'erreur ci-dessous:

Traceback (most recent call last): 
    File "IncomingMessagesCompanyIDEvent.py", line 105, in <module> 
    data = getData() 
    File "IncomingMessagesCompanyIDEvent.py", line 65, in getData 
    text_file.write(response.json()) 
    File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\requests\models.py", line 858, in json 
self.content.decode(encoding), **kwargs 
    File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\json\__init__.py", line 319, in loads 
return _default_decoder.decode(s) 
    File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 342, in decode 
raise JSONDecodeError("Extra data", s, end) 
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 6) 

EDIT2: Problème résolu. Voir ci-dessous pour ma réponse.

Répondre

1

Avez-vous essayé response.json() au lieu de response.text?

+0

Voir la modification à mon post original. Je suppose que cette erreur est due au fait que la réponse reçue de la commande GET n'est pas au format JSON. – skyfx

+0

Pouvez-vous filtrer les éléments non-json en utilisant 'response.iter_lines()'? – cullywest

+0

Malheureusement, le problème n'est pas uniquement lié aux éléments non-json, mais au fait que les données sont réparties sur plusieurs lignes. J'ai mis à jour l'exemple dans mon post original pour refléter cela. – skyfx

0

Il semble que vous avez un très mal formé JSON là-bas, la première chose que vous devez faire est:

import re 
 

 
response = response.text 
 
#filter out the newlines from literal 
 
response = re.sub('\n','',response) 
 
filtered_response = re.search('\[.*\]',response).group(0) 
 
#We still have a bad json string - '[{"variable1":v 2000 alue,"variable2 1ecd ":value}]', values should be quoted not only keys.

Maintenant, vous avez la valeur approximative, vous pouvez faire le tour de jouer avec regex et en citant les valeurs, mais vous ne devriez pas avoir à le faire. Donc, si vous contrôlez la source de la chaîne, essayez d'abord de citer les valeurs.

0

Le problème a été résolu. Il semble avoir été lié à la version de Python. Je suis passé de l'utilisation de la version 3.5.1 à l'utilisation de la version 2.7.13, qui a résolu le problème. Les données JSON sont maintenant renvoyées dans une seule chaîne sans hexadécimaux ajoutés.