每次我嘗試在這個 api Request_URL='https://freeserv.dukascopy.com/2.0/api/group=quotes&method=realtimeSentimentIndex&enabled=true&key=bsq3l3p5lc8w4s0c&type=swfx&jsonp=_callbacks____1kvynk
JSONDecodeError:期望值:第 1 行第 1 列(字符 0)
import json
import requests
import pandas as pd
r = requests.get(Request_URL)
df = pd.DataFrame(r.json())
uj5u.com熱心網友回復:
問題是回傳的回應是JSONP格式的。也就是說,它是 JavaScript,它包含對帶有 JavaScript結構引數的函式的呼叫(如果它有單引號,它應該是一個有效的JSON字串,但不能保證它是)。部分看起來像:
_callbacks____1kvynkpid([{"id":"10012" ...])
因此,我們需要首先洗掉 JavaScript 呼叫,它們是直到并包括第一個(字符和最后一個字符的前導字符):
import requests
import json
request_url = 'https://freeserv.dukascopy.com/2.0/api?group=quotes&method=realtimeSentimentIndex&enabled=true&key=bsq3l3p5lc8w4s0c&type=swfx&jsonp=_callbacks____1kvynkpid'
r = requests.get(request_url)
text = r.text
idx = text.index('(')
# skip everything up to and including opening '(' and then skip closing ')'
text = text[idx 1:-1]
print(json.loads(text))
印刷:
[{'id': '10012', 'title': 'ESP.IDX/EUR', 'date': '1636925400000', 'long': '71.43', 'short': '28.57'}, {'id': '10104', 'title': 'AUS.IDX/AUD', 'date': '1636925400000', 'long': '70.59', 'short': '29.41'}, {'id': '10266', 'title': 'NLD.IDX/EUR', 'date': '1636925400000', 'long': '73.48', 'short': '26.52'},
... data too big too fully reproduce
{'id': '82862', 'title': 'MAT/USD', 'date': '1636925400000', 'long': '70.27', 'short': '29.73'}, {'id': '82866', 'title': 'ENJ/USD', 'date': '1636925400000', 'long': '72.16', 'short': '27.84'}]
在這種情況下,解釋為字串時的結構符合JSON格式,因此我們能夠使用json.loads(). 但是如果 JavaScript 結構(部分)是:
[{'id':'10012'}]
這既是合法的 JavaScript 也是合法的 Python,但不合法,JSON因為字串必須用雙引號括起來才能有效JSON。但由于它是合法的 Python,我們可以使用ast.literal_eval:
import requests
import ast
request_url = 'https://freeserv.dukascopy.com/2.0/api?group=quotes&method=realtimeSentimentIndex&enabled=true&key=bsq3l3p5lc8w4s0c&type=swfx&jsonp=_callbacks____1kvynkpid'
r = requests.get(request_url)
text = r.text
idx = text.index('(')
# skip everything up to and including opening '(' and then skip closing ')'
text = text[idx 1:-1]
print(ast.literal_eval(text))
當然,對于目前的狀況都json.loads和ast.literal_eval發生在作業。但是,如果 JavaScript 結構是:
[{id:'10012'}]
這是有效的 JavaScript 但是,唉,不是有效的 Python 并且不能用json.loads或決議ast.literal_eval。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361680.html
