Datenverarbeitung von requests.get() response

Django, Flask, Bottle, WSGI, CGI…
Antworten
Luzius12345
User
Beiträge: 2
Registriert: Dienstag 19. März 2019, 17:46

Hallo zusammen,
ich bin neu hier und auch neu in Python also entschuldigt mich bitte wenn die Frage irgendwie banal ist.
Ich möchte für ein privates Projekt Daten aus der API von der Seite http://opengtindb.org/api.php abgreifen.
Das funktioniert auch soweit das ich mir die Antworten als String ausgeben lassen kann. Nun brauch ich aber nicht die komplette Antwort sondern nur Teile davon. Ich habe bereits ein wenig recherchiert und versucht es in json umzuwandeln aberleider ohne Erfolg. Auch es direkt als r.json() auszugen funktioniert leider nicht.
code:

Code: Alles auswählen

import requests

payload = {'ean': '4019736006831', 'cmd': 'query', 'queryid': "400000000"}
r = requests.get('http://opengtindb.org/', params=payload)
print(r.json())
Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:/GoogleDrive/Jahresarbeit/Dokumente/I2C_Raspi/requeststest.py", line 7, in <module>
    print(r.json())
  File "D:\Python\lib\site-packages\requests\models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "D:\Python\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "D:\Python\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "D:\Python\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)

Process finished with exit code 1
Ich hoffe mir kann da jemand helfen,
Grüße Luzius
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Luzius12345: Das ist halt kein JSON, also kann man es auch nicht als JSON parsen. Das sieht nicht nach einem Standardformat aus, da musst Du selbst einen Parser für schreiben. An den ”Trennstrichen” aufteilen und dann die einzelnen Abschnitte in Schlüssel-/Wert-Paare zerlegen und in Wörterbücher stecken, würde ich sagen sind da so die ersten Schritte.

Oder sich bei den Leuten die das bereitstellen beschweren, dass die das nicht in einem Standardformat liefern.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Luzius12345
User
Beiträge: 2
Registriert: Dienstag 19. März 2019, 17:46

Uff klingt kompliziert.
Aber vielen Dank für die schnelle Antwort, Mal schauen wie ich da jetzt weiter Mache.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du könntest die Antwort des Request hier posten, damit wir sehen, was der für eine Struktur hat. Normalerweise sollte das nicht so kompliziert sein, das zu parsen.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Die verlinkte Seite hat ja eine Beschreibung. Das Format sieht simpel aus.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@noisefloor
http://opengtindb.org/api.php
War die Abfrage erfolgreich, so erhalten Sie Daten im Textformat (MIME-Typ text/plain) zurück, die beispielsweise so aussehen können:

Code: Alles auswählen

error=0
---
name=Natürliches Mineralwasser
detailname=Bad Vilbeler RIED Quelle
vendor=H. Kroner GmbH & CO. KG
maincat=Getränke, Alkohol
subcat=
contents=19
pack=1
descr=Natürliches Mineralwasser mit Kohlensäure versetzt
origin=Deutschland
validated=25 %
---
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und es kann mehr als ein Datensatz geliefert werden. Die sind dann alle durch '---\n' getrennt. `contents` und `pack` sind Bitfelder. Was die einzelnen Bits bedeuten steht auch auf der Seite. Da kann man vielleicht `enum.IntFlag` sinnvoll einsetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit `more_itertools` ist das ein Einzeiler, wenn man es denn als Einzeiler schreiben möchte:

Code: Alles auswählen

from more_itertools import split_at
error, *results, _empty = [
    dict(l.strip().split('=',1) for l in group)
    for group in split_at(lines, lambda l:l.strip()=='---')
]
Antworten