我正在尝试从API导入数据,然后将其导出到CSV文件。 但是,这不起作用,并且出现以下错误:
expected string or buffer.
我什至尝试使用json.dumps
代替json.load
,但出现以下错误:
<response 200 is not json serializable.
示例代码:
import requests
from requests.auth import HTTPBasicAuth
import pandas as pd
import json
import csv
proxies = {
'http': 'http://dummy.restapiexample.com/api/v1/employees
'https': 'http://dummy.restapiexample.com/api/v1/employees
}
url = 'http://dummy.restapiexample.com/api/v1/employees'
r = s.get(url=url, proxies=proxies, auth=HTTPBasicAuth('user', 'pass'))
employee_parsed = json.loads(r)
emp_data = employee_parsed['Employee ID']
employ_data = open('"Path" testname.csv', 'w')
csvwriter = csv.writer(employ_data)
count = 0
for emp in emp_data:
if count == 0:
header = emp.keys()
csvwriter.writerow(header)
count += 1
csvwriter.writerow(emp.values())
employ_data.close()
有人知道我如何解决出现的错误吗?任何提示将不胜感激,或者任何见识或在哪里寻找/思考。谢谢!
答案 0 :(得分:1)
更改此:
employee_parsed = json.loads(r)
对此:
employee_parsed = json.load(r)
查看this的答案,它讨论json.loads
和json.load
之间的区别。
编辑:
根据@roganjosh,您可以使用内置的json解码器,例如:
r = s.get(url=url, proxies=proxies, auth=HTTPBasicAuth('user', 'pass')).json()
查看说明here。
答案 1 :(得分:1)
您的示例代码有多个问题。我已更正代码以读取api并将csv作为输出提供。
import requests as s
from requests.auth import HTTPBasicAuth
import pandas as pd
import json
import csv
proxies = {
'http': 'http://dummy.restapiexample.com/api/v1/employees',
'https': 'http://dummy.restapiexample.com/api/v1/employees'
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
url = 'http://dummy.restapiexample.com/api/v1/employees' #get key
r = s.get(url=url, headers=headers)
employee_parsed = r.json();
emp_data = employee_parsed;
employ_data = open('testname.csv', 'w', encoding="utf-8")
csvwriter = csv.writer(employ_data)
count = 0
for emp in emp_data:
if count == 0:
header = emp.keys()
csvwriter.writerow(header)
count += 1
csvwriter.writerow(emp.values())
employ_data.close()
您可以使用response.json()直接获取json响应,如我的示例所示。如果要使用json.loads解析响应,则只需解析响应的内容。可以这样做,
employee_parsed = json.loads(r.content)
主要问题是使用的API不会返回正确的响应,除非用户代理被Python欺骗。这可以通过插入欺骗性的标头来解决。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
url = 'http://dummy.restapiexample.com/api/v1/employees' #get key
r = s.get(url=url, headers=headers)
在我的示例中,我以s形式导入了请求,以确保代码得以执行。
答案 2 :(得分:1)
您应该从回复中提取文字
employee_parsed = json.loads(r.text)
或只是employee_parsed = r.json()