Анализ HTTP-ответа в Python
Я хочу манипулировать информацией в ЭТО url. Я могу успешно открыть его и прочитать его содержимое. Но то, что я действительно хочу сделать, - это выбросить все, что я не хочу, и манипулировать вещами, которые хочу сохранить.
Есть ли способ преобразовать строку в dict, чтобы я мог перебирать ее? Или мне просто нужно разбирать его как есть (тип str)?
from urllib.request import urlopen
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)
print(response.read()) # returns string with info
Ответы
Ответ 1
Это было разрешено.
Когда я напечатал response.read()
, я заметил, что b
был добавлен в строку (например, b'{"a":1,..
). "B" обозначает байты и служит объявлением для типа объекта, который вы обрабатываете. Поскольку я знал, что строка может быть преобразована в dict с помощью json.loads('string')
, мне просто пришлось преобразовать тип байта в тип строки. Я сделал это, расшифровав ответ на utf-8 decode('utf-8')
. Как только это было в строковом типе, моя проблема была решена, и я легко мог перебирать dict
.
Я не знаю, является ли это самым быстрым или самым "питоническим" способом написания этого, но он работает, и theres всегда время спустя оптимизация и совершенствование! Полный код для моего решения:
from urllib.request import urlopen
import json
# Get the dataset
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)
# Convert bytes to string type and string type to dict
string = response.read().decode('utf-8')
json_obj = json.loads(string)
print(json_obj['source_name']) # prints the string with 'source_name' key
Если кто-то найдет это через Google, я надеюсь, что это поможет. Лучший совет, который я могу дать, внимательно прочитал ваши ошибки и обратил пристальное внимание на результат, который вы получаете.
Ответ 2
Вместо этого вы можете использовать библиотеку запросов python.
import requests
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = requests.get(url)
dict = response.json()
Теперь вы можете манипулировать "dict", как словарь python.
Ответ 3
json
работает с текстом Unicode в Python 3 (сам формат JSON определен только в терминах текста Unicode), и поэтому вам нужно декодировать байты, полученные в ответе HTTP. r.headers.get_content_charset('utf-8')
получает вашу кодировку символов:
#!/usr/bin/env python3
import io
import json
from urllib.request import urlopen
with urlopen('https://httpbin.org/get') as r, \
io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
result = json.load(file)
print(result['headers']['User-Agent'])
Здесь не нужно использовать io.TextIOWrapper
:
#!/usr/bin/env python3
import json
from urllib.request import urlopen
with urlopen('https://httpbin.org/get') as r:
result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8')))
print(result['headers']['User-Agent'])
Ответ 4
Я думаю, что в python 3.4 все изменилось. Это сработало для меня:
print("resp:" + json.dumps(resp.json()))