Elemente mehrerer Listen verbinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
julianlud90
User
Beiträge: 4
Registriert: Donnerstag 10. November 2022, 20:00

Moin zusammen,

also ich habe folgendes Problem bzw. einen Punkt an dem mir die Idee bzw das Know How fehlt um meinen Gedanken umzusetzen.

Zur Erklärung.
Ich habe einen Web scrapper geschrieben, der mir aktuell von einer Seite den Titel, den Preis und die Bildpfade ausgibt.
Die Titel und die Preise sind jeweils in einer eigenen liste die ich dann mit einem zähler und einer for schleife verbunden habe das quasi immer
Titel + preis ausgegeben wird und in einer neuen Lise gespeichert wird .
jetzt habe ich noch die Liste mit den Bildern bzw den Bildpfaden. Hier ist mein Problem das die Artikel der Seite zwar immer einen Titel und einen Preis haben aber leider immer unterschiedlich viele Bilder dazu gehören. mal habe ich nur ein bild und mal habe ich zwei oder drei. Die pfade haben aber immer eine gemeinsamkeit bzw es kommt im bildpfad immer die Artikelnummer und der name des Artikels vor. also artikel eins hat zb 2 bilder und in dem Pfad kommt dann eine vierstellige zahl vor die gleich ist und beim nächsten artiekl dann eine andere vier stellige zahl und so weiter.

Meine idee war jetzt das ich diese Liste mit den Bildpfaden in sich verschachtel und sowas in der art schreibe ( ist nur ein Beispiel )

liste = [1122, 1122, 1122, 1133, 1133, 1133, 1144, 1144, 1155, 1155, 1166]

liste_neu = []

for element in liste :
if "1122" in element:
liste_neu.append(element)


sowas in der richtung hatte ich hier gedacht
Zuletzt geändert von julianlud90 am Freitag 11. November 2022, 10:02, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Zusammengehörende Daten sollten immer zusammen bleiben und nicht in unterschiedlichen Listen stehen. Dazu kann man zum Beispiel Tuple verwenden:

Code: Alles auswählen

titel_preise_bilder = [
    ("Titel A", "12543,34€", ["bild1", "bild2"]),
    ("Titel B", "432,55€", ["bild3", "bild4"]),
    ...
]
Und diese Liste sollte ja schon beim Web-Scrapping so angelegt werden, sprich, zusammengehörende Teile sind hoffentlich auch im HTML in irgendeiner Form so sturkturiert, dass sie eine gemeinsame Wurzel haben.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Ich würde versuchen die URLs über einen entsprechenden key zu gruppieren:

Code: Alles auswählen

from itertools import groupby
from pprint import pprint

titles = ["a", "b", "c", "d", "e", "f", "g"]
numbers = [1, 2, 3, 4, 643, 648, 983]
pictures = ["https://foo.bar/4", "https://foo.bar/643/1", "https://foo.bar/643/2", "https://foo.bar/643/", "https://foo.bar/983", "https://foo.bar/983/"]

titles_numbers = {number: title for title, number in zip(titles, numbers)}

key = lambda x: x.split("/")[3]
for number, picture_urls in groupby(sorted(pictures, key=key), key=key):
    number = int(number)
    titles_numbers[number] = (titles_numbers[number], list(picture_urls))
pprint(titles_numbers)
Nun musst du nur eine entsprechende key-Funktion für deine Daten finden, die zuverlässig die richtigen Pfade identifiziert.
julianlud90
User
Beiträge: 4
Registriert: Donnerstag 10. November 2022, 20:00

super das werde ich mal antesten. das mit dem modul groupby kannte ich noch nicht. aber das könnte funktionieren :-)
Die bildfade die zusammen gehören die haben immer die gleiche vierstellige nummer darüber sollte ich die identifizieren können :-)
danke dir
julianlud90
User
Beiträge: 4
Registriert: Donnerstag 10. November 2022, 20:00

Mit key identifizieren meinst du doch ein bestimmtes element in dem Bildpfad der nur in den pfaden vor kommt die gruppiert werden sollen oder ?
Und wird hier ein dictionairy erstellt ?

Glaube du bist vom Programmieren um einiges weiter als ich, muss erstmal deinen code verstehen^^
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@einfachTobi: `titles_numbers` ist ungünstig benannt und wird auch umständlich erzeugt. Statt

Code: Alles auswählen

titles_numbers = {number: title for title, number in zip(titles, numbers)}
würde man da besser

Code: Alles auswählen

number_to_title = dict(zip(numbers, titles))
schreiben.
Wobei ich das wiederverwenden von dieser Datenstruktur auch ziemlich falsch finde, denn die Werte haben ja unterschiedliche Typen. Insbesondere wenn nicht alle Werte ersetzt werden sollten, ist das am Ende eine inkonsistente Datenstruktur.

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import groupby
from pprint import pprint


def get_number_from_image_url(url):
    return int(url.split("/")[3])


def main():
    numbers = [1, 2, 3, 4, 643, 648, 983]
    titles = ["a", "b", "c", "d", "e", "f", "g"]
    assert len(numbers) == len(titles)
    image_urls = [
        "https://foo.bar/4",
        "https://foo.bar/643/1",
        "https://foo.bar/643/2",
        "https://foo.bar/643/",
        "https://foo.bar/983",
        "https://foo.bar/983/",
    ]

    number_to_title = dict(zip(numbers, titles))
    number_to_title_and_urls = {
        number: (number_to_title[number], list(image_url_group))
        for number, image_url_group in groupby(
            sorted(image_urls, key=get_number_from_image_url),
            key=get_number_from_image_url,
        )
    }

    pprint(number_to_title_and_urls)


if __name__ == "__main__":
    main()
Wobei ich mich aber auch noch mal ausdrücklich Sirius3 anschliessen möchte: Das Problem sollte so gar nicht bestehen, weil man die Struktur schon während des scrapens aufbauen würde, statt das erst in separaten Listen zu sammeln.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
julianlud90
User
Beiträge: 4
Registriert: Donnerstag 10. November 2022, 20:00

Ich danke euch allen, die letzte Variante muss ich auch mal teste. ich habe nur noch nicht verstanden wo ich jetzt die nummern aus den Bildfaden zum identifizieren einfügen muss / kann.
Und das mit den verschiedenen Listen das das nicht so gut ist verstehe ich schon allerdings bin ich noch sehr am anfang und das ganze ist ein Projekt damit ich die übung bekomme und so hatte ich es hin bekommen und war schon erstmal recht stolz darauf ^^ aber wenn ich etwas habe das funktioniert auch wenn es noch besser geht habe ich ja auch etwas das ich im anschluss dann noch verbessern kann als weiteres projekt quasi.aber garnicht einfach den code zu verstehen muss ich sagen
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

@julianlud90: es ist ja auch viel schwieriger im Nachhinein zu versuchen, die richtige Zuordnung hinzubekommen. Von Anfang an die richtigen Datenstrukturen zu erzeugen ist viel einfacher.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

@__blackjack__: Du hast vollkommen recht. Habe das nur schnell, aber dafür unüberlegt, hingeschrieben. Danke für den Hinweis.
Antworten