Python API Не могу загрузить Str с помощью Json.load () - PullRequest
0 голосов
/ 17 декабря 2018

Я только начал изучать json в python и начал практиковаться в получении биткойнов с сайта;однако, я продолжаю получать эту ошибку:

''Exception Value: Expecting value: line 1 column 1 (char 0)''

Когда я печатаю источник, он показывает b 'в начале строки.После просмотра в Интернете, я думаю, что это проблема, связанная с байтовыми и строковыми данными (также проверено на веб-сайте, что формат json действительно правильный).Мой код выглядит следующим образом:

import json
import urllib.request

url = 'http://www.quandl.com/api/v3/datasets/BCHARTS/BITSTAMPUSD'

with urllib.request.urlopen(url) as response:
    source = response.read().decode('utf-8')
data = json.loads(source)

В настоящее время я переключаюсь на

data = requests.get(url).json()

и работает плавно, но все же я хочу исправить вышеуказанную ошибку.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы получаете сообщение об ошибке, потому что ответ от сервера - обычный HTML, а данные, которые вы ищете, находятся внутри тега <pre>.Вам придется извлечь содержимое тега <pre> или включить соответствующие заголовки при выполнении запроса.

Из документов API Quandl
Изменить форматы Те же данные можно получить в JSONформат:

https://www.quandl.com/api/v3/datasets/OPEC/ORB.json
Или в XML: https://www.quandl.com/api/v3/datasets/OPEC/ORB.xml

Так что в вашем случае это будет:

url = 'http://www.quandl.com/api/v3/datasets/BCHARTS/BITSTAMPUSD.json'
0 голосов
/ 17 декабря 2018

Вам нужно сообщить серверу, вы хотите получить ответ в формате JSON.В настоящее время вы получаете HTML.

import json 
import urllib.request 

url = 'http://www.quandl.com/api/v3/datasets/BCHARTS/BITSTAMPUSD' 
request = urllib.request.Request(url) 
request.add_header('Accept', 'application/json') 
with urllib.request.urlopen(request) as response: 
     source = response.read().decode('utf-8') 
data = json.loads(source)           
0 голосов
/ 17 декабря 2018

Вы получаете эту ошибку, потому что ответ в формате HTML.Не в формате JSON.

Вы можете напечатать переменную source и посмотреть.

Фактический JSON находится внутри тега <code>:

<html class="gr__quandl_com"><head>
<head>...</head>
<body>
    <pre>
        <code>
        {...}             #Here is the actual JSON.
        
    

Вы можете использовать библиотеки, такие как beautifulsoup для анализа HTML и извлечения JSON перед созданием объекта JSON.


В качестве альтернативы вы можете задатьсервер для отправки ответа в формате JSON, добавив следующий заголовок при выполнении запроса:

request.add_header('Accept', 'application/json') 
...