[英]How to print a JSON API to data frames in Python
我已經看到了許多針對類似問題的修復程序,但我似乎無法弄清楚這個特定的 API 有什么不同。
我是新手,但嘗試使用私人鏈接來工作,看看我是否可以加快我正在處理的手動過程。
我已經嘗試了幾個帶有公共 API 的腳本,這些腳本可以工作——我認為這是一個權限錯誤,但我實際上能夠使用這個腳本將 API 提要打印到 TERMINAL,這給了我希望:
import requests as rq
from bs4 import BeautifulSoup
import urllib3
import certifi
# urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
# url = 'https://api.chucknorris.io/jokes/random'
url = 'realurl'
req = rq.get(url, verify=False)
soup = BeautifulSoup(req.text, 'html.parser')
print(soup)
如果我能夠打印到終端,我應該能夠打印到谷歌表格(或者至少是 CSV,我想)......我的問題是創建數據幀; 我嘗試了很多不同的方法,但我一直看到各種錯誤 - 這個是“類型方法的對象不是 JSON 可序列化的”
我想要做的就是 append 數據到我用 Gspread 設置的 G 表:
import gspread
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
from pandas import json_normalize
import json
import urllib3
from urllib3 import request
import certifi
http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('sheetkey')
worksheet = sh.sheet1
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
}
# url = 'https://api.chucknorris.io/jokes/random'
url = 'realurl'
req = rq.get(url, verify=False)
soup = BeautifulSoup(req.text, 'html.parser')
df1 = pd.DataFrame(soup)
df = df1.to_json
# pd.set_option("display.max_rows", None)
# pd.set_option("display.max_columns", None)
AddData = [df]
worksheet.append_row(AddData)
我在這一點上看到的所有修復程序都是在我的 object 上添加 _toCSV 或 _toDict ......但我已經嘗試在任何地方添加它。
我也很困惑為什么它說我需要 JSON 格式,而原來的 API 是 JSON 格式。
我在這里錯過了什么嗎? 我基本上只想從我的第一個代碼中獲取數據集並創建 DataFrame,以便我可以打印到 G Sheet。 任何建議將不勝感激。
更新:
我現在正在將提要中的一個類別標題打印到工作表中:
import gspread
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
from pandas import json_normalize
import json
import urllib3
from urllib3 import request
import certifi
http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('key')
worksheet = sh.sheet1
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
}
# url = 'https://api.chucknorris.io/jokes/random'
url = 'realurl'
req = rq.get(url, verify=False)
soup = BeautifulSoup(req.text, 'html.parser')
# df1 = pd.DataFrame(soup)
dfs = json.loads(str(soup))
for df in dfs:
print(df)
# pd.set_option("display.max_rows", None)
# pd.set_option("display.max_columns", None)
AddData = [df]
worksheet.append_row(AddData)
進一步更新:
需要明確的是,問題來自將數據推送到 Google 表格。 @Furas 的答案可以打印數據,但與 Gspread 配對時不能打印,如下所示:
import requests
import pandas as pd
import gspread
gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o')
worksheet = sh.sheet1
url = 'https://api.chucknorris.io/jokes/random'
response = requests.get(url, verify=False)
data = response.json()
# print(data)
df = pd.json_normalize(data)
# print(df)
AddData = [df]
worksheet.append_row(AddData)
我看到的錯誤是:
Traceback (most recent call last):
File "c:\Users\JSON-Fetch\FinalTry.py", line 26, in <module>
worksheet.append_row(AddData)
File "C:\Python\python3.10.5\lib\site-packages\gspread\worksheet.py", line 1289, in append_row
return self.append_rows(
File "C:\Python\python3.10.5\lib\site-packages\gspread\worksheet.py", line 1338, in append_rows
return self.spreadsheet.values_append(range_label, params, body)
File "C:\Python\python3.10.5\lib\site-packages\gspread\spreadsheet.py", line 149, in values_append
r = self.client.request("post", url, params=params, json=body)
File "C:\Python\python3.10.5\lib\site-packages\gspread\client.py", line 73, in request
response = getattr(self.session, method)(
File "C:\Python\python3.10.5\lib\site-packages\requests\sessions.py", line 590, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "C:\Python\python3.10.5\lib\site-packages\google\auth\transport\requests.py", line 549, in request
response = super(AuthorizedSession, self).request(
File "C:\Python\python3.10.5\lib\site-packages\requests\sessions.py", line 528, in request
prep = self.prepare_request(req)
File "C:\Python\python3.10.5\lib\site-packages\requests\sessions.py", line 456, in prepare_request
p.prepare(
File "C:\Python\python3.10.5\lib\site-packages\requests\models.py", line 319, in prepare
self.prepare_body(data, files, json)
File "C:\Python\python3.10.5\lib\site-packages\requests\models.py", line 469, in prepare_body
body = complexjson.dumps(json)
File "C:\Python\python3.10.5\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python\python3.10.5\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python\python3.10.5\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Python\python3.10.5\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type DataFrame is not JSON serializable
我不明白您為什么為此使用BeautifulSoup
。
它適用於HTML
或XML
但不適用於JSON
或CSV
。
如果頁面發送JSON
數據,那么您只需要
data = req.json()
將其作為 python 字典獲取。
如果你想轉換為DataFrame
那么
df = pd.json_normalize(req.json())
import requests
import pandas as pd
url = 'https://api.chucknorris.io/jokes/random'
response = requests.get(url, verify=False)
data = response.json()
print(data)
df = pd.json_normalize(data)
print(df)
如果頁面發送CSV
那么你甚至可以直接使用pandas
df = pd.read_csv(url)
最終您可以使用帶有 io.StringIO 的requests
在io.StringIO
中創建類似文件的 object
import io
response = requests.get(url, ...)
file_like_object = io.StringIO(response.text)
df = pd.read_csv(file_like_object)
但這一切都取決於您沒有顯示的真正的 url。
編輯:
如果你想把它添加到谷歌表格那么你不需要DataFrame
但python的字典
data = response.json()
worksheet.append_row([data])
如果 JSON 可能有包含許多項目的列表,那么您可能需要for
-loop 將數據放在單獨的行中
data = response.json()
for item in data:
worksheet.append_row([item])
如果你真的必須使用pandas
然后閱讀文檔Using gspread with pandas
它可能需要這樣的東西
for index, row in df.iterrows():
worksheet.append_row(row.values.tolist())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.