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
Elemente mehrerer Listen verbinden
-
- User
- Beiträge: 4
- Registriert: Donnerstag 10. November 2022, 20:00
Zuletzt geändert von julianlud90 am Freitag 11. November 2022, 10:02, insgesamt 1-mal geändert.
Zusammengehörende Daten sollten immer zusammen bleiben und nicht in unterschiedlichen Listen stehen. Dazu kann man zum Beispiel Tuple verwenden:
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.
Code: Alles auswählen
titel_preise_bilder = [
("Titel A", "12543,34€", ["bild1", "bild2"]),
("Titel B", "432,55€", ["bild3", "bild4"]),
...
]
-
- User
- Beiträge: 512
- Registriert: Mittwoch 13. November 2019, 08:38
Ich würde versuchen die URLs über einen entsprechenden key zu gruppieren:
Nun musst du nur eine entsprechende key-Funktion für deine Daten finden, die zuverlässig die richtigen Pfade identifiziert.
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)
-
- 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

Die bildfade die zusammen gehören die haben immer die gleiche vierstellige nummer darüber sollte ich die identifizieren können

danke dir
-
- 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^^
Und wird hier ein dictionairy erstellt ?
Glaube du bist vom Programmieren um einiges weiter als ich, muss erstmal deinen code verstehen^^
- __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
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.
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.
Code: Alles auswählen
titles_numbers = {number: title for title, number in zip(titles, numbers)}
Code: Alles auswählen
number_to_title = dict(zip(numbers, titles))
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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- 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
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
-
- 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.