Seite 1 von 1
Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 09:35
von julianlud90
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
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 09:59
von Sirius3
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.
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 10:19
von einfachTobi
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.
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 10:31
von julianlud90
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
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 10:36
von julianlud90
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^^
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 11:04
von __blackjack__
@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
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.
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 12:00
von julianlud90
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
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 13:59
von Sirius3
@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.
Re: Elemente mehrerer Listen verbinden
Verfasst: Freitag 11. November 2022, 23:24
von einfachTobi
@__blackjack__: Du hast vollkommen recht. Habe das nur schnell, aber dafür unüberlegt, hingeschrieben. Danke für den Hinweis.