2017-10-13 92 views
-1

我想通過Url進行JSON抓取,並在Python中轉換爲CSV,但出現錯誤。請看下面。JSON,Url抓取,CSV轉換,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") 

我正的誤差: 我正的誤差: 我正的錯誤: f.writerow([鑫[ 「home_page」],辛[ 「消息」],辛[」 FULL_NAME「]

TypeError: string indices must be integers 

回答

0

如果沒有有效的登錄細節,這是不可能重現,但我會建議您切換到使用csv.DictWriter()

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()) 

您將獲得包含Test.csv

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

DictWriter是能夠直接與字典條目工作。只需指定創建時所需的標題名稱即可。如果JSON包含其他條目,則可以通過將extrasaction='ignore'指定爲參數來忽略這些條目。

您所做的調用僅返回單個條目,因此不需要循環。如果將文件模式更改爲a,它顯然會將其附加到現有文件。在這種情況下,您可能不希望每次都繼續寫頭文件。

+0

Fxied,對不起,應該說'fieldnames' –

+0

您的請求不返回JSON數據,只是HTML。很明顯,將HTML解碼爲JSON會給出一個'JSONDecodeError'。在普通瀏覽器中訪問該URL會導致'shoiapi.erpnext.com不存在' –

+0

腳本現在應該可以在CSV文件中爲您提供單個條目。 –