2017-10-13 2 views
-1

Ich möchte JSON durch Url abrufen und in Python in CSV konvertieren, aber ich bekomme einen Fehler. Siehe unten.JSON, Url holen, CSV konvertieren, Python

import requests 
import pprint 
import json 
import csv 
mysession = requests.Session() 

url = 'https://shoiapi.xx.com/api/method/login' 
data = {'usr': '@gmail.com', 'pwd': 'mh'} 
ret=mysession.post(url, data=data) 
response_data_json = ret.json() 
print("---------------Post---------------------\n") 
print(response_data_json) 
stringOfJsonData = json.dumps(response_data_json) 

tempf=open('test.csv', 'a') 
f = csv.writer(tempf) 
f.writerow(["home_page", "message", "full_name"]) 
pprint.pprint(stringOfJsonData) 

for xin in stringOfJsonData: 
    f.writerow([xin["home_page"],xin["message"],xin["full_name"] 
       ]) 

tempf.close() 

print("---------------Out error---------------------\n") 
Error i am geting 

f.writerow([xin["home_page"],xin["message"],xin["full_name"] 
TypeError: string indices must be integers 
print("---------------Out error---------------------\n") 

Der Fehler Ich erhalte: Der Fehler Ich erhalte: Der Fehler Ich erhalte: f.writerow ([xin [ "home_page"], xin [ "message"], xin [“ full_name "]

TypeError: string indices must be integers 

Antwort

0

Ohne gültige Login-Daten nicht möglich ist, neu zu erstellen, aber ich würde vorschlagen, Sie schalten eine csv.DictWriter() zu verwenden:

import requests 
import pprint 
import json 
import csv 

mysession = requests.Session() 

url = 'https://shoaibapi.xxx.com/api/method/login' 
data = {'usr': '[email protected]', 'pwd': 'xxx'} 
ret = mysession.post(url, data=data) 

with open('test.csv', 'w', newline='') as f_output: 
    csv_output = csv.DictWriter(f_output, fieldnames=['home_page', 'message', 'full_name'], extrasaction='ignore') 
    csv_output.writeheader() 
    csv_output.writerow(ret.json()) 

Sie erhalten eine Test.csv enthält:

home_page,message,full_name 
/desk,Logged In,shoaib shaikh 

Die DictWriter der Lage ist, direkt mit Wörterbucheinträgen zu arbeiten. Geben Sie einfach die Kopfzeilennamen an, die bei der Erstellung benötigt werden. Wenn der JSON andere Einträge enthält, können diese durch Angabe von extrasaction='ignore' als Parameter ignoriert werden.

Der Aufruf, den Sie vornehmen, gibt nur einen einzelnen Eintrag zurück, so dass keine Schleife erforderlich ist. Wenn Sie den Dateimodus auf a ändern, wird er offensichtlich an eine vorhandene Datei angehängt. In diesem Fall möchten Sie wahrscheinlich nicht jedes Mal den Header schreiben.

+0

Fxied, sorry, das sollte 'Feldnamen' haben –

+0

Die Anfrage, die Sie haben, gibt keine JSON-Daten zurück, nur HTML. Offensichtlich wird das Dekodieren von HTML als JSON einen 'JSONDecodeError' ergeben. Wenn ich in einem normalen Browser zu dieser URL gehe, habe ich 'shoiapi.erpnext.com existiert nicht ' –

+0

Das Skript sollte nun funktionieren und Ihnen einen einzigen Eintrag in Ihrer CSV-Datei geben. –