Seite 1 von 1

Datenverarbeitung von requests.get() response

Verfasst: Dienstag 19. März 2019, 18:12
von Luzius12345
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

Re: Datenverarbeitung von requests.get() response

Verfasst: Dienstag 19. März 2019, 19:55
von __blackjack__
@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.

Re: Datenverarbeitung von requests.get() response

Verfasst: Dienstag 19. März 2019, 22:32
von Luzius12345
Uff klingt kompliziert.
Aber vielen Dank für die schnelle Antwort, Mal schauen wie ich da jetzt weiter Mache.

Re: Datenverarbeitung von requests.get() response

Verfasst: Mittwoch 20. März 2019, 10:12
von noisefloor
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

Re: Datenverarbeitung von requests.get() response

Verfasst: Mittwoch 20. März 2019, 10:24
von __blackjack__
@noisefloor: Die verlinkte Seite hat ja eine Beschreibung. Das Format sieht simpel aus.

Re: Datenverarbeitung von requests.get() response

Verfasst: Mittwoch 20. März 2019, 10:25
von lackschuh
@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 %
---

Re: Datenverarbeitung von requests.get() response

Verfasst: Mittwoch 20. März 2019, 10:39
von __blackjack__
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.

Re: Datenverarbeitung von requests.get() response

Verfasst: Mittwoch 20. März 2019, 11:03
von Sirius3
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()=='---')
]