web-dev-qa-db-de.com

Analyse der HTTP-Antwort in Python

Ich möchte die Informationen unter THIS url bearbeiten. Ich kann es erfolgreich öffnen und seinen Inhalt lesen. Aber was ich wirklich tun möchte, ist, all das Zeug wegzuwerfen, das ich nicht will, und das zu manipulieren, was ich behalten möchte.

Gibt es eine Möglichkeit, die Zeichenfolge in ein Diktat umzuwandeln, damit ich darüber iterieren kann? Oder muss ich es nur so analysieren (str-Typ)?

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
26
Colton Allen

Dies wurde gelöst.

Als ich response.read() druckte, fiel mir auf, dass b vor der Zeichenfolge (z. B. b'{"a":1,..) ausgegeben wurde. Das "b" steht für Bytes und dient als Deklaration für den Typ des Objekts, das Sie behandeln. Da ich wusste, dass eine Zeichenfolge mithilfe von json.loads('string') in ein Diktat umgewandelt werden kann, musste ich nur den Bytetyp in einen Zeichenfolgentyp konvertieren. Ich tat dies, indem ich die Antwort auf utf-8 decode('utf-8') dekodierte. Sobald es sich in einem String-Typ befand, war mein Problem gelöst und ich konnte leicht die dict durchlaufen.

Ich weiß nicht, ob dies die schnellste oder "Pythonic" -Methode ist, aber es funktioniert und es ist immer Zeit für Optimierung und Verbesserung! Vollständiger Code für meine Lösung:

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

Wenn irgendjemand dies über Google findet, hoffe ich, dass dies hilft. Der beste Rat, den ich geben kann, ist, die Fehler genau zu lesen und die Ausgabe, die Sie erhalten, genau zu beobachten.

55
Colton Allen

Sie können stattdessen auch die Anforderungsbibliothek von Python verwenden.

import requests

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'    
response = requests.get(url)    
dict = response.json()

Jetzt können Sie das "Diktat" wie ein Python-Wörterbuch bearbeiten.

9
Shaurya Mittal

json arbeitet mit Unicode-Text in Python 3 (das JSON-Format selbst ist nur in Unicode-Text definiert). Daher müssen Sie in der HTTP-Antwort empfangene Bytes decodieren. r.headers.get_content_charset('utf-8') erhält die Zeichenkodierung:

#!/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'])

Es ist nicht notwendig, io.TextIOWrapper hier zu verwenden:

#!/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'])
6
jfs

Ich denke, die Dinge haben sich in Python 3.4 geändert. Das hat für mich funktioniert:

print("resp:" + json.dumps(resp.json()))
0
Ajay Gautam