Python: Lesen von JSON-Daten von der Web-API

Was ist JSON?

Es scheint, dass die Datenstruktur sowohl für Menschen als auch für Computer (grob) leicht zu verstehen ist. [Was ist JSON - Qiita](http://qiita.com/SotaSuzuki/items/c3b46c4e24c1ca9b4d37#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E8%A1 % A8% E7% 8F% BE)


Es scheint, dass Sie JSON-Daten mit Python lesen können, indem Sie die JSON-Bibliothek importieren.

Es scheint, dass Sie, wenn Sie es lesen, genauso damit umgehen können wie mit dem Wörterbuchtyp. (Ich bin mir nicht sicher über den diktären Typ, also werde ich hier lernen.)

Informationen zum Wörterbuchtyp

--Dictionary-Typ ist eine Menge (Element) von Schlüssel und Wert

Extrahieren Sie den Wert durch Angabe des Schlüssels

test01.py


# -*- coding: utf-8 -*-

dict = {"name": "tamago", "color": "yellow"}

#Geben Sie den Schlüssel an und rufen Sie den Wert ab
print dict["name"]
print dict["color"]

test01.Ausgabeergebnis von py


tamago
yellow

Wenn Sie versuchen, einen nicht vorhandenen Schlüssel abzurufen, wird ein Fehler angezeigt.

Holen Sie sich eine Liste der Schlüssel und Werte

test02.py


# -*- coding: utf-8 -*-

dict = {"name": "tamago", "color", "yellow"}

#Holen Sie sich eine Liste der Schlüssel
keyList = dict.keys()
print keyList

#Holen Sie sich eine Liste von Werten
vakList = dict.values()
print valList

#Holen Sie sich eine Liste der Schlüssel und Werte
list = dict.items()
print list

test02.Ausgabeergebnis von py


['color', 'name']
['yellow', 'tamago']
[('color', 'yellow'), ('name', 'tamago')]

Ich weiß nicht, wie ich es bekommen soll, da der Wörterbuchtyp keine Reihenfolge der Elemente enthält

Ich habe eine ungefähre Vorstellung vom Wörterbuch! !!

Abrufen von JSON-Daten von der Web-API

Die diesmal verwendete Web-API ist die Kommentarerfassungs-API von Twicas (Kommentarerfassungs-API - Twicas).

Wenn Sie JSON-Daten von WebAPI abrufen, importieren Sie "urllib" und verwenden Sie die Methode, um sie abzurufen. Um die abgerufenen Daten mit Python zu verarbeiten, importieren Sie "json" und verwenden Sie die Methode

test02.py


# -*- coding: utf-8 -*-

import urllib
import json
import sys
import codecs

#Jetzt können Sie die Zeichen entfernen, die nicht in cp932 konvertiert werden können
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout, errors='ignore')

#Rufen Sie das Ergebnis einer JSON-formatierten Zeichenfolge von der Web-API ab
def dataGet():

    #URI-Schema
    url = 'http://api.twitcasting.tv/api/commentlist?'

    #URI-Parameterdaten
    param = {
        'user': 'tamago324_pad',    #ID der Person, die Sie erhalten möchten
        'type': 'json'             #Angabe der zu erfassenden Daten
    }

    #Erstellen einer Zeichenfolge von URI-Parametern
    paramStr = urllib.urlencode(param)  # type=json&user=tamago324_Als Pad geformt

    #Erstellen eines zu lesenden Objekts
    readObj = urllib.urlopen(url + paramStr)

    #Holen Sie sich JSON von der Web-API
    response = readObj.read()

    # print type(response)  # >> <type 'str'>

    return response

#Konvertieren Sie die von der Web-API erhaltenen Daten in JSON
def jsonConversion(jsonStr):

    #Konvertieren Sie von webAPI erhaltene JSON-Daten in ein Formular, das mit Python verwendet werden kann
    data = json.loads(jsonStr)
    return data

    #Japanisch ist u'\u767d'Konvertieren Sie in Unicode
    # return json.dumps(data[0], ensure_ascii=False)

#Kommentarbuchungszeit h:mm:In ss konvertieren
def getElapsedTime(duration):

    secStr = ""
    minStr = ""

    hourInt = duration / 3600
    minInt = (duration -3600 * hourInt) / 60
    secInt = duration % 60

    if minInt <= 9:
        minStr = "0" + str(minInt)
    else:
        minStr = str(minInt)

    if secInt <= 9:
        secStr = "0" + str(secInt)
    else:
        secStr = str(secInt)

    if hourInt >= 1:
        return str(hourInt) + ":" + minStr + ":" + secStr
    else:
        return minStr + ":" + secStr

if __name__ == '__main__':

    resStr = dataGet()
    res = jsonConversion(resStr)

    #Zeigen Sie die erfassten Daten an
    for item in res:
        print getElapsedTime(item['duration']) + " " + item['userstatus']['name'] + " " + item['message']

10:14 Es ist zufällig ein Test
09:49 Es ist zufällig ein Kommentar

Abrufen von JSON-Daten von der Web-API

def jsonGet (): ruft JSON-Daten von webAPI </ strong> ab Ich erstelle eine Zeichenfolge von URI-Parametern aus dem Wörterbuch mit "urllib.urlencode ()". Wenn von dieser Methode mehrere Zeichenfolgen in Form von key = value zurückgegeben werden, werden sie mit & kombiniert (Beispiel: key1 = value1 & key2 = value2). Das Wörterbuch enthält keine Reihenfolge, daher können Sie die Reihenfolge, in der sie kombiniert werden, nicht angeben.

Erstellen eines Objekts zum Lesen von JSON-Daten mit urllib.urlopen ()

Abrufen von JSON-Daten von der Web-API mit der Methode des erstellten Objekts (object.read ()) Der Rückgabewert scheint ein "str" -Typ zu sein

Konvertieren Sie die erfassten Daten in JSON, die von Python verarbeitet werden können

Konvertieren Sie den von json.loads () erhaltenen JSON so, dass er von Python verarbeitet werden kann. Da es jedoch als Unicode zurückgegeben wird, wird Japanisch wie "\ u3063" json.dumps (data, sure_ascii = False) "konnte Japanisch fest anzeigen! Ich dachte, es wäre eine Zeichenfolge ... "Daten" waren "Liste" ... Ist dies die einzige Möglichkeit, nacheinander von Unicode nach Str zu konvertieren ...

Ich war besorgt darüber, was ich tun sollte, aber ich habe versucht, nur einen Kommentar zu erhalten, und als ich ihn mit "Druckdaten [0] [" Nachricht "]" anzeigte, wurde er fest auf Japanisch angezeigt! !! !! Der Kommentar enthielt jedoch "꒳", und als ich versuchte, ihn anzuzeigen, wurde der Fehler "UnicodeEncodeError: 'cp932' Codec kann das Zeichen u '\ ua4b3' an Position 0: unzulässige Multibyte-Sequenz" nicht codieren.

Was tun, wenn aufgrund von UnicodeEncodeError </ b> keine Zeichen auf der Konsole angezeigt werden können? Wenn Sie eine Unicode-Zeichenfolge drucken möchten, die gelegentlich Zeichen enthält, die von cp932 auf der Windows-Konsole nicht ausgedrückt werden können - Yasukazu Nishios Hatena-Tagebuch sys.stdout = codecs.getwriter (sys.stdout.encoding) (sys.stdout, error = 'ignore') Wie auch immer, Sie können die Zeichen ausblenden, die von cp932 nicht ausgedrückt werden können (der Mechanismus ist unbekannt. Ich denke darüber nach, es jetzt zu klären.

Im Moment mache ich es auf der Konsole, aber ich denke, dass es besser aussehen wird, wenn es auf Windows Apps usw. angezeigt werden kann.

Wörterbuch-Einführung in Python Bibliothek: json - Leben mit Python 20.5. Urllib - Zugriff auf eine Ressource über URL - Python 2.7.x-Dokumentation Versuchen Sie, die Yahoo-API mit dem Python-BTY-Memorandum zu verwenden Kommunikationsnotiz in Python - Qiita abrufen, veröffentlichen Holen Sie sich eine Unicode-JSON-Zeichenfolge einschließlich Japanisch. --Qiita 18.2. Json - JSON-Encoder und -Decoder - Python 2.7.x-Dokumentation

Recommended Posts