Parsowanie danych otrzymanych przez allegro WebAPI

Parsowanie danych otrzymanych przez allegro WebAPI
CH
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 5 lat
  • Postów:5
0

Hej, walczę z połączeniem się z allegro przez allegro WebAPI, co po części mi się udało i jestem w stanie uzyskać dane z serwera... jednak nie mam pojęcia w jaki sposób parsować je w pythonie ktoś może będzie wiedzieć ? Jestem zielony (poziom 2 rok studiów, a tam robimy ogólnie c++ tylko, pythona sam się ucze).
Byłbym wdzięczny za każdą pomoc, dzisiaj od rana siedzę i w końcu udało mi się zrobić poniższe... i dane przychodzą! Jednak są w takiej formie że nie mam pojęcia co z nimi zrobić...

Wysyłam zapytanie i w odpowiedzi do zmiennej zapisuje mi się coś takiego

Kopiuj
(ArrayOfBillingdatatype){ item[] = 
(BillingDataType){ billingId = 54 billingType = "AFP" billingFixperc = "P" billingName = "Wpłata z Programu partnerskiego" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "1.2" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 332 billingType = "AP1" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet osobisty" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "10" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 333 billingType = "AP2" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet profesjonalny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "600" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 334 billingType = "AP3" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet pełny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "2500" billingAuctionType = 0 },

no i tona tego typu danych, powyżej jest tylko małą część.... jednak nie jest to ani słownik ani lista, tablica nic...
Co to za typ danych i jak go sparsować żebym mógł go np. przeszukać w poszukiwaniu konkretnych wartości?
Ktoś może coś robił z Allegro WebAPI ? i byłby w stanie pomóc ?
Jak nie uda mi się ogarnąć tego powyższego spróbuję powalczyć z "Allegro REST Api" -> coś tam próbowałem ale dla mnie to magia wszystko jest i nawet gorzej to rozumiem niż WebAPI.

A może jakoś inaczej polecacie się za to zabrać, jakiś inny sposób?

edytowany 2x, ostatnio: flowCRANE
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4886
1

To jest jakaś lista rekordów, wszystkie zawierają takie same pola, na początek cos takiego:

Kopiuj
 s  = """(ArrayOfBillingdatatype) item[] = 
(BillingDataType){ billingId = 54 billingType = "AFP" billingFixperc = "P" billingName = "Wpłata z Programu partnerskiego" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "1.2" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 332 billingType = "AP1" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet osobisty" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "10" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 333 billingType = "AP2" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet profesjonalny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "600" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 334 billingType = "AP3" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet pełny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "2500" billingAuctionType = 0 }"""
                         
main_arr = []
temp_str = ""

for ind in range(len(s)):
    if s[ind] == "{":
        cnt = ind + 1
        while s[cnt] != "}":
            temp_str += s[cnt]
            cnt += 1
        main_arr.append(temp_str)
        temp_str = ""
#print(main_arr[:2])

main_arr[0] =main_arr[0].replace('=', ' = ');
main_arr[0] = main_arr[0].split();
print(main_arr[0])

Po ktrótce: Do stringa, a potem iteracja i, jak widać wszystko co w nawiasach klamrowych do pojedynczego stringa, a jak nawias się zamknie to ten string doczepiamy do listy głównej (main_arr), i jeszzce split().
Teraz Masz listę list, jakieś wyszukiwanie juz chyba łatwo zrobić, albo jeszcze sparsować to do listy dictów. Oczywiście, wszystko czytelnie w funkcjach


edytowany 2x, ostatnio: lion137
CH
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 5 lat
  • Postów:5
0

Ok, ogólnie będę uzupełniać co udało mi się z tym zrobić... bo możliwe że komuś się jeszcze przyda... po necie krążą plotki że to Allegro WebAPI to piekło informatyków na ziemi. Udało mi się "odkryć" że ten typ danych tworzy się przez moduł suds w dokumentacji opis "Lightweight SOAP client", a powyższe dane są w formacie SOAP, odpowiednio korzystając z pythona jesteśmy w stanie je filtrować i inne takie, wszystko w dokumentacji... co prawda wciąż nie udało mi się zdobyć żadnych informacji o jakimkolwiek konkretnym produkcie (nawet listy produktów wciąż nie mam), ale chyba coraz bliżej celu...

Powyższe na pewno się przyda jak już w końcu jakieś dane zdobędę... szybko przerobić na listę i do bazy, więc dzięki ;)

edytowany 1x, ostatnio: chacken
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4886
0

To co Pokazałeś tutaj to nie jakieś piekło w Pythonie mozna to obrabiać lekko łatwo i przyjemnie:)


CH
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 5 lat
  • Postów:5
0

To byłbym wdzięczny za jeszcze jedną małą wskazówkę. Mianowicie według dokumentacji (https://jortel.fedorapeople.org/suds/doc/suds.client.Client-class.html#dict) mogę to zamienić na listę używając "Client.items(obj)" lub na słownik "Client.dict(obj)"

np.

Kopiuj
result = Client.item(objekt_suds)

i teraz wypisuję wszystko z listy:

Kopiuj
for item in result:
print(item)

Nie ważne czy zamienię na listę jak tutaj czy na słownik dostaję coś w takim wymiarze:

Kopiuj
--> ('itemsCount', 423808) --> ('itemsFeaturedCount', 1000)
 --> ('itemsList', <suds.sudsobject.ArrayOfItemslisttype object at 0x0895F970>) 
--> ('categoriesList', <suds.sudsobject.CategoriesListType object at 0x09482390>) 
--> ('filtersList', <suds.sudsobject.ArrayOfFilterslisttype object at 0x094858B0>)

Wiem że są to chyba adresy komórek w pamięci które zawierają kolejne listy, ale w jaki sposób się do nich dostać?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4886
0

Pewnie by sie jakiś dalo, tylko Teraz pisze z komorki, to wield nie zrobie. A, Np., suds.sudsobject.ArrayOfItemslisttype, czy mozna sie do tego obiektu odwolac, on gdzies w ogole istnieje czy to sa tylko nazwy, ktore Chcesz wyciagnac z tego chaosu.


G1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:48
0

Podbijam temat bo mam podobny problem.
Za pomocą metody *doGetItemList * pobieram liste aukcji w danej kategorii.
Zwrotnie otrzymuje obiekt o typie class 'suds.sudsobject.reply'
Następnie próbuję wyciągnąć tylko to co mnie interesuje, czyli ID wylistowanych aukcji.
Używam metody Client.dict(), która konwertuje moją odpowiedź do słownika, a następnie wycinam tylko wartość słownika itemsList, która jest typu: class 'suds.sudsobject.ArrayOfItemslisttype' i wygląda następująco:

Kopiuj
(ArrayOfItemslisttype){
   item[] = 
      (ItemsListType){
         itemId = 7005321172
         itemTitle = "Bmw 120d MPower,193KM,58tyś,F20"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-06 20:18:11+01:00
...
      (ItemsListType){
         itemId = 7005688555
         itemTitle = "BMW 1 120d Urban line Lublin 180 koni f20 2011"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-07 00:09:05+01:00
...
      (ItemsListType){
         itemId = 7007292879
         itemTitle = "BMW F20 M pakiet automat kamera navi gwarancja 1wł"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-07 22:50:58+01:00

Mnie to wygląda na jakiś XML? SOAP? Sam nie wiem... chciałbym to docelowo pakować do bazy danych w czystej formie:

itemId itemTitle
7005321172 "Bmw 120d MPower,193KM,58tyś,F20"

Ale nie wiem jak to wyczyścić... Ktoś ma jakiś pomysł?

edytowany 2x, ostatnio: gruby19
lion137
I co, Masz dużo takich samych obiektów tylko z róznymi itemami?
G1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:48
0

@lion137
Edytowałem strukture ArrayOfItemslisttype, żeby CI to lepiej zobrazować. Każdy ItemsListType to jedna aukcja, takich obiektów mogę miec od 1 do 1000, ale ich struktura zawsze jest tak samo głęboko zagnieżdżona. Oczywiście to nie jest cały obiekt - Cały ma kilkadziesiąt rekordów (zdjęcia, opisy, itd) ale nie chce zaśmiecać a wydaje mi się, że to wystarczy do zrozumienia działania.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4886
0

Rozumiem, że tam gdzie są u Ciebie trzy kropki, to nawiasy klamrowe są zamykane. Jak tak to Postępuj podobnie, jak pokazałem tutaj:
Parsowanie danych otrzymanych przez allegro WebAPI
Zrobić z całości string:

Kopiuj
s = """(ArrayOfItemslisttype){
   item[] =
      (ItemsListType){
         itemId = 7005321172
         itemTitle = "Bmw 120d MPower,193KM,58tyś,F20"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-06 20:18:11+01:00
    }
      (ItemsListType){
         itemId = 7005688555
         itemTitle = "BMW 1 120d Urban line Lublin 180 koni f20 2011"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-07 00:09:05+01:00
    }
    }"""

Teraz w zasadzie można chyba użyć dokładnie takiej pętli, jak w moim linkowanym poście (Ty bedziesz miał jeszcze znaki '\n' - końca linii), i Otrzymasz listę stringów. Dalej uważnie ją filtrując, używając metod na stringach i listach, Dostaniesz w końcu interesujące Cię pola.


G1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:48
0

Jakoś próbuje sobie radzić z tym problemem - może trochę inaczej niz napisał @lion137, ale chyba skutecznie.

Natomiast w trakcie pracy natrafiłem na inny problem - metoda doGetItemsList, którą pobieram identyfikatory aukcji, pozwala na pobranie max 1000 pozycji danej kategorii. Chciałbym móc w jakiś sposób sterować tym zestawem pozycji.
Np. pobierać paczkami po 1000, ale za każdym razem inny zestaw.
Początkowy pomysł był taki, żeby proces chodził np. co godzine i pobierał tylko aukcje utworzone w ciągu ostatniej godziny, ale niestety data utworzenia jest niewidoczna z poziomu API, więc nie mogę po niej filtrować. Co prawda mogę sortować... więc w tej chwili plan jest taki, żeby skrypt uruchamiac co godzinę i pobierać np 500 pozycji sortując po dacie utworzenia - to w pewnym stopniu rozwiąże problem, ale wygeneruje kolejne - braki w danych (jeśli w ciągu godziny zostanie wystawionych wiecej niz 500 aukcji), lub duplikaty (jeżeli mniej niż 500). Co prawda z duplikatami mogę sobie poradzić na poziomie bazy danych, ale to jest ostateczność...

Macie inne pomysły?

Link do dokumentacji:
http://allegro.pl/webapi/documentation.php/show/id,1342#method-input
http://allegro.pl/webapi/documentation.php/show/id,342#method-input

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)