Webscraping: Wie finde ich den richtigen selector für Tabelle

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.
ThomasRandus
User
Beiträge: 8
Registriert: Donnerstag 8. Mai 2025, 16:12

Hi ,
ich versuche gerade die Daten von folgender Website zu scrapen:

Tabelle: Historische Kurse und Umsätze DAX etwas weiter unten auf der Seite:
https://www.boerse-frankfurt.de/index/d ... d-umsaetze

Also die Tabelle mit: Datum, Eröffnung, Schluss, Tageshoch

Das Script mit dem ich arbeite sieht so aus:

Code: Alles auswählen

import os
import time
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Chrome-Optionen für die Verbindung zu einem bereits laufenden Browser
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

# Passe den Pfad zum ChromeDriver an
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=chrome_options)

target_url = "https://www.boerse-frankfurt.de/index/dax/kurshistorie/historische-kurse-und-umsaetze"

def switch_to_target_tab(driver, url):
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        if url in driver.current_url:
            return True
    return False

if not switch_to_target_tab(driver, target_url):
    print("Tab nicht gefunden!")
    driver.quit()
    exit()

# Warte, bis die Tabelle geladen ist
# Passe den Selector ggf. an, falls die Seite sich ändert
for _ in range(10):
    try:
        # Mit CSS-Selector nach Klasse:
	table = driver.find_element(By.CSS_SELECTOR, "app-price-history _nghost-boerse-frankfurt-c352035757")
    except:
        time.sleep(2)
else:print("Tabelle nicht gefunden!")
driver.quit()
exit()

rows = table.find_elements(By.TAG_NAME, "tr")[1:]  # Überspringe Kopfzeile

csv_data = []
for row in rows:
    cols = row.find_elements(By.TAG_NAME, "td")
    if len(cols) >= 5:
        datum = cols[0].text.strip()
        eroeffnung = cols[1].text.strip()
        schluss = cols[4].text.strip()
        tageshoch = cols[2].text.strip()
        tagestief = cols[3].text.strip()
        csv_data.append([datum] [eroeffnung] [schluss] [tageshoch] [tagestief])
        ......
        
Das Script läuft nun bis zur Zeile mit:
"table = driver.find_element"

gut durch. Aber es scheitert daran, dass ich nicht hinbekomme wie ich die Tabelle mit den Kursdaten auswählen kann. Meine Versuche mit das "inspect" und "Copy Selctor" für die Tabelle:

Code: Alles auswählen

body > app-root > app-wrapper > div > div > div.content-wrapper > app-index > div.row.ng-star-inserted > div > app-price-history > div.widget.app-loading-spinner-parent.d-block.ar-mt.ar-p > div > div > div.table-responsive > table
hat mit Selenium irgendwie alles nicht so fkt. ich bekomme den Dreh nicht raus wie ich die Tabelle selektiere, das Script endet immer mit der else clause: "Tabelle nicht gefunden". Den ("next" Button bräuchte ich dann auch noch zum weiterblättern).
HTML ist bei mir auch 20 Jahre her aber ich habe das Gefühl dass die Website versucht die Daten zu verstecken und nachlädt. Komme ich da irgendwie anders dran mit beautifulsoup vielleicht? Da sind die Daten ja sonst könnte ich sie im Browser ja nicht sehen...

Wie ihr merkt habe ich davon keine Ahnung :?: Hänge seit gestern daran und wäre für jede Hilfe dankbar!
juergenkulow
User
Beiträge: 5
Registriert: Freitag 6. Juni 2025, 08:09

Code: Alles auswählen

kulow@kulow-G73Jw:~$ python3 /tmp/dax.py
  File "/tmp/dax.py", line 36
    table = driver.find_element(By.CSS_SELECTOR, "app-price-history _nghost-boerse-frankfurt-c352035757")
TabError: inconsistent use of tabs and spaces in indentation
TabError: Inkonsistente Verwendung von Tabulatoren und Leerzeichen bei der Einrückung

Habe alle Leerzeichen in der for-Schleife gelöscht und durch Tabulatoren ersetzt.

Problem gelöst, aber dann gibt es eine neue Fehlermeldung:

Code: Alles auswählen

kulow@kulow-G73Jw:~$ python3 /tmp/dax.py
  File "/tmp/dax.py", line 55
    ......
       ^^^
SyntaxError: invalid syntax
python-forum.de Fehlermeldung "inconsistent use of tabs and spaces in indentation"
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
DeaD_EyE
User
Beiträge: 1225
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Tabulatoren sollte man bei Python nicht verwenden, sondern Leerzeichen zur Einrückung. Die 6 Punkte sind falsch. 3 Punkte repräsentieren das Ellipsis-Objekt. Mit 3 Punkten würde es funktionieren. Entferne die Punkte doch komplett.

Die drei Punkte bzw. Ellipsis sind damals für Numpy (Slicing) eingeführt worden. Bei TypeHints werden die 3 Punkte auch oft verwendet.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich benutze die gerne für Blöcke die noch nicht ausprogrammiert sind. Man könnte auch ``pass`` verwenden, aber das könnte in einigen Fällen ja auch absichtlich dort stehen in fertigem Code.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1225
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

FastAPI ist zurückgerudert und rät jetzt davon ab das Ellipsis-Objekt zu verwenden: https://github.com/fastapi/fastapi/pull/13377
Wo es noch weiterhin eingesetzt wird, ist bei den Python-Stubs für MyPy (TypeHints checker): https://mypy.readthedocs.io/en/stable/stubs.html

Wo man die 3 Punkte nicht einsetzt, ist z.B. im eigenen Code, wenn man Funktionen erstellt, diese aber noch nichts machen. Da sollte man auf jeden Fall pass verwenden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Genau letzteres mache ich. Warum sollte ich das auf keinen Fall machen?
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
ThomasRandus
User
Beiträge: 8
Registriert: Donnerstag 8. Mai 2025, 16:12

Hm Ok da ist wohl was mit der Formatierung hier im Forum vom Code schiefgegangen "Indendation" Error habe ich keinen.

Zudem hätte ich vielleicht dazuschreiben sollen, dass erstmal Chrome im debugging modus geöffnet und die Seite geöffnet sein muss.
Ich habe das mal an den Anfang vom Code als Kommentar geschrieben.

Hier nochmals der Code:

Code: Alles auswählen

#Bevor das Script gestartet werden kann vorher:

#1. Chrome schließen
#2. Chrome mit Debugging-Port öffnen:
#o	Öffne die Eingabeaufforderung (cmd).
#o	Gib ein (Pfad ggf. anpassen):
#"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
#Jetzt die Seite: öffnen https://www.boerse-frankfurt.de/index/dax/kurshistorie/historische-kurse-und-umsaetze
# Cookies akzeptieren und das Script kann gestartet werden

import os
import time
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Chrome-Optionen für die Verbindung zu einem bereits laufenden Browser
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

# Passe den Pfad zum ChromeDriver an
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=chrome_options)

target_url = "https://www.boerse-frankfurt.de/index/dax/kurshistorie/historische-kurse-und-umsaetze"

def switch_to_target_tab(driver, url):
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        if url in driver.current_url:
            return True
    return False

if not switch_to_target_tab(driver, target_url):
    print("Tab nicht gefunden!")
    driver.quit()
    exit()

# Warte, bis die Tabelle geladen ist
# Passe den Selector ggf. an, falls die Seite sich ändert
for _ in range(10):
    try:
        # Mit CSS-Selector nach Klasse:
        table = driver.find_element(By.CSS_SELECTOR, "app-price-history _nghost-boerse-frankfurt-c352035757")
    except:
        time.sleep(2)
else:print("Tabelle nicht gefunden!")
driver.quit()
exit()

rows = table.find_elements(By.TAG_NAME, "tr")[1:]  # Überspringe Kopfzeile

csv_data = []
for row in rows:
    cols = row.find_elements(By.TAG_NAME, "td")
    if len(cols) >= 5:
        datum = cols[0].text.strip()
        eroeffnung = cols[1].text.strip()
        schluss = cols[4].text.strip()
        tageshoch = cols[2].text.strip()
        tagestief = cols[3].text.strip()
        csv_data.append([datum] [eroeffnung] [schluss] [tageshoch] [tagestief])

# Speicherort für Windows 7 Downloads-Ordner
downloads = os.path.join(os.environ["USERPROFILE"], "Downloads")
output_path = os.path.join(downloads, "dax_kurse.csv")

with open(output_path, "w", newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(["Datum"], ["Eröffnung"], ["Schluss"], ["Tageshoch"], ["Tagestief"])
    writer.writerows(csv_data)

print(f"CSV gespeichert unter: {output_path}")
driver.quit()
Bei mir gibt das "Tabelle nciht gefunden zurück.
Ursache ist die Zeile unterhalb: "# Mit CSS-Selector nach Klasse:"

der Selektor scheint nicht der richtige zu sein.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie Bist Du denn auf den Selektor gekommen? Irgendwoher mußt Du doch "_nghost-boerse-frankfurt-c352035757" haben?
Was bedeutet `hat mit Selenium irgendwie alles nicht so fkt.`? Was hast Du ausprobiert und was war das Ergebnis?

Der Code hat noch weitere Einrückungsfehler, die Du beim Entwickeln des Codes eigentlich nicht machen dürftest, weil das Logisch keinen Sinn ergibt. Dann gibt es noch weitere Fehler, auf die Du erst stößt, wenn der Teil davor läuft.
Woher kommt denn der Code, wenn Du über das Finden der Tabelle noch nicht hinausgekommen bist? Man entwickelt so ein Programm Stück für Stück. Erst wenn ein Teil funktioniert, macht man weiter.
Am besten Entwickelt man interaktiv, in dem man find_element so lange variiert, bis man das gewünschte erhält.
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

@ThomasRandus: Und um die Ausführungen von Sirius3 zu präzisieren: Es nützt nichts, sich Code von ChatGPT generieren zu lassen wenn man ihn nicht versteht.
Benutzeravatar
grubenfox
User
Beiträge: 602
Registriert: Freitag 2. Dezember 2022, 15:49

ThomasRandus hat geschrieben: Samstag 14. Juni 2025, 14:45 das Script endet immer mit der else clause: "Tabelle nicht gefunden".
Funktioniert wie programmiert... der Selektor ist dabei völlig egal.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1225
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__blackjack__ hat geschrieben: Dienstag 17. Juni 2025, 09:02 Genau letzteres mache ich. Warum sollte ich das auf keinen Fall machen?
Du verwendest pass -> alles OK
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Nein tue ich nicht, warum ist jetzt nicht alles OK?
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1225
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__blackjack__ hat geschrieben: Mittwoch 18. Juni 2025, 12:31 @DeaD_EyE: Nein tue ich nicht, warum ist jetzt nicht alles OK?
Also verwendest du in Funktionen, die noch nicht implementiert worden sind, 3 Punkte?

Code: Alles auswählen

def foo():
    ...
Ich verwende pass, um die Verwirrung zu vermeiden.

Code: Alles auswählen

def foo():
    pass
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich verwende drei Punkte um die Verwirrung zu vermeiden. Das sind ja Auslassungspunkte, die sagen dem Leser dass da was fehlt. ``pass`` könnte da auch ganz regulär stehen, zum Beispiel weil das für eine API verwendet wird die bestimmte Funktionen erwartet, wo man also die Funktion haben muss, aber es auch okay/sinnvoll sein kann, wenn die nichts tut. Hatte da beispielsweise mal ein Projekt wo man Plugins/Erweiterungen als Module in einem bestimmten Verzeichnis ablegte und die bestimmte Funktionen haben mussten (`init()`, `cleanup()`, `get_api_description()`, …). Und wenn man dann bei `cleanup()` ``pass`` stehen hat, könnte das so gewollt sein, aber es könnte auch sein, dass man da noch etwas implementieren wollte. Da finde ich ``...`` als Mittel das auszudrücken halt praktisch. Oder auch an Stellen im Code wo noch was fehlt, wo ``pass`` noch unpassender aussieht, weil das ja nur in Blöcken Sinn macht, wo sonst nichts steht.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
ThomasRandus
User
Beiträge: 8
Registriert: Donnerstag 8. Mai 2025, 16:12

Sirius3 hat geschrieben: Mittwoch 18. Juni 2025, 09:42 Wie Bist Du denn auf den Selektor gekommen? Irgendwoher mußt Du doch "_nghost-boerse-frankfurt-c352035757" haben?
Was bedeutet `hat mit Selenium irgendwie alles nicht so fkt.`? Was hast Du ausprobiert und was war das Ergebnis?

Der Code hat noch weitere Einrückungsfehler, die Du beim Entwickeln des Codes eigentlich nicht machen dürftest, weil das Logisch keinen Sinn ergibt. Dann gibt es noch weitere Fehler, auf die Du erst stößt, wenn der Teil davor läuft.
Woher kommt denn der Code, wenn Du über das Finden der Tabelle noch nicht hinausgekommen bist? Man entwickelt so ein Programm Stück für Stück. Erst wenn ein Teil funktioniert, macht man weiter.
Am besten Entwickelt man interaktiv, in dem man find_element so lange variiert, bis man das gewünschte erhält.
Der Code ist aus einer AI natürlich. Ich habe dann mit rumprobieren langsam die Fehler ausgemerzt. Bis er dann zum CSS Selector an der Stelle lief.
Dachte eigentlich das wäre der Part den ich mit "inspect" hinbekomme. Da habe ich 2-3h lang alles mögliche rumprobiert. Ist aber nicht mehr wie früher, dass da steht tableid= und dann gehts....

Generell muss ich sagen dass ich diese Kommentare nach dem Motto: "Es bring nichts ChatGTP Code zu nutzen wenn man ihn nicht versteht", das ist irgendwie sinnlos.. Das weiß der Newbie schon selbst. Es wäre auch besser wir hätten 10 Mio € auf dem Konto...

Man braucht halt ein lauffähiges Script, das man sich das mal anschauen kann und dann ranlernen kann. Beispiele in Büchern gehen meist von sehr einfachen Websiten aus, deswegen wollte ich das gleich mal battletestet mit einer eher realistischen Seite probieren, und siehe da da gehen dann die Probleme auch gleich richtig los mit Seiten die inhalt nachladen und nciht mehr so easy aufgebaut sind... Wahrscheinlich will die dt. Börse den Inhalt wohl verstecken?
Zuletzt geändert von ThomasRandus am Mittwoch 18. Juni 2025, 16:04, insgesamt 1-mal geändert.
ThomasRandus
User
Beiträge: 8
Registriert: Donnerstag 8. Mai 2025, 16:12

grubenfox hat geschrieben: Mittwoch 18. Juni 2025, 12:00
ThomasRandus hat geschrieben: Samstag 14. Juni 2025, 14:45 das Script endet immer mit der else clause: "Tabelle nicht gefunden".
Funktioniert wie programmiert... der Selektor ist dabei völlig egal.
Care to elaborate?
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThomasRandus: ich kenne Deine Motivation nicht, und gehe erst einmal vom Besten aus, dass Du tatsächlich Python lernen willst. Denn dafür ist das Forum hier da. Wenn Du schon weißt, dass ChatGPT nur Quark produziert, warum nutzt Du es dann? Wie man normalerweise beim Programmieren vorgeht, habe ich Dir geschrieben. Dabei kann man schon kurze Programmteile von einer AI generieren lassen, aber diese muß man dann verstehen, testen und so modifizieren, dass sie funktionieren, bevor man mit dem nächsten Teil weitermacht.
Wenn Du dagegen ganz oben geschrieben hättest, "Ich habe mit ChatGPT folgenden Code generiert, der funktioniert nicht und nun suche ich eine natürliche Intelligenz, die das Problem für mich nicht umsonst aber genauso konstenlos löst", dann gäbe es halt 0 Antworten, denn wir haben ja eine natürliche Intelligenz und keine natürliche Dummheit.

Der von grubenfox angemerkte Programmteil:

Code: Alles auswählen

for _ in range(10):
    try:
        # Mit CSS-Selector nach Klasse:
        table = driver.find_element(By.CSS_SELECTOR, "app-price-history _nghost-boerse-frankfurt-c352035757")
    except:
        time.sleep(2)
else:print("Tabelle nicht gefunden!")
driver.quit()
exit()
wird immer "Tabelle nicht gefunden" ausgeben und wird dann immer sofort das Programm beenden, weil das da wirklich so steht. Es ist nur eine Frage, wie lange das Programm bis zu dieser Ausgabe braucht.
Du hast eine for-Schleife, die nach einem CSS-Ausdruck sucht, wenn gefunden, mach das nochmal 10 mal, falls nicht gefunden, warte 2 Sekunden und mach das nochmal 10 mal.
Der else-Block wird immer dann betreten, wenn die Schleife bis zu Ende gelaufen ist, und nicht vorher per break verlassen wurde. Da es kein `break` gibt, wird also immer der Text ausgegeben.
Unabhängig davon ist dann immer der nächste Schritt, das Programm zu beenden.

Meine KI sagt, dass ganze müßte so aussehen:

Code: Alles auswählen

for _ in range(10):
    try:
        # Mit CSS-Selector nach Klasse:
        table = driver.find_element(By.CSS_SELECTOR, "app-price-history _nghost-boerse-frankfurt-c352035757")
        break  # Beende die Schleife, wenn das Element gefunden wurde
    except NoSuchElementException:
        time.sleep(2)
else:
    print("Tabelle nicht gefunden!")
    driver.quit()
    exit()

# Hier stellen wir sicher, dass `table` definiert ist
rows = table.find_elements(By.TAG_NAME, "tr")[1:]
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

ThomasRandus hat geschrieben: Mittwoch 18. Juni 2025, 16:00Generell muss ich sagen dass ich diese Kommentare nach dem Motto: "Es bring nichts ChatGTP Code zu nutzen wenn man ihn nicht versteht", das ist irgendwie sinnlos.. Das weiß der Newbie schon selbst. Es wäre auch besser wir hätten 10 Mio € auf dem Konto...
Keine Ahnung, was du mit dem Absatz sagen willst.
Wenn du denkst dass die Aussage "Es bringt nichts Code generiern zu lassen, den man nicht versteht" nach dem Gewurschtel sinnlos findest, dann wird es mit dem Programmieren vielleicht etwas schwierig. Und wenn du das weißt und trotzdem in der jetzige Situation bist, hmm...
Daher meine Empfehlung: Ein guter Einstiegspunkt für das Erlenen von Python ist das offizielle Tutorial. Und ohne Python zu lernen, wird es nicht funktionieren. Ich empfehle den umgekehrten Weg zu gehen. Erarbeite dir das Script selbst, statt es dir generieren zu lassen. Dann verstehst du, was du tust, statt zu raten.
ThomasRandus
User
Beiträge: 8
Registriert: Donnerstag 8. Mai 2025, 16:12

Also weitergeholfen hat mir das Forum beim Lernen von Python eigentlich überhaupt nicht. Da war die AI produktiver. So machen sich Menschen überflüssig in dem sie den Kontakt mit anderen Menschen so UNANGENEHM wie möglich machen. Als Du mich da so ausgefragt hast wie einen Schüler und diese Kommentare mit "Es bringt nichts ChatGTP Code zu nutzen wenn man ihn nicht versteht". Da wusste ich schon das ist so eines der Foren wo nur Leute sind die sich wichtig machen wollen aber kommen wird da nichts Sinnvolles.

In den 10 Zeilen Code die Du mir gegeben hast hat jetzt 3 Fehler produziert. Erkläre es doch so, dass ein Anfänger auch was davon hat.
Ich musste wieder eine AI fragen (!) warum die NoSuchElement Exception... Name Error kam. Nur durch die AI kam der Hinweis, dass am Anfang erstmal das Modul:

Code: Alles auswählen

from selenium.common.exceptions import NoSuchElementException
importiert werden muss.
Tabelle nicht gefunden!
Traceback (most recent call last):
File "webscraping1_änderung_Python_Forumde.py", line 54, in <module>
exit()
File "D:\.....AppData\Local\Programs\MUEDIT~1\Python\lib\_sitebuiltins.py", line 26, in __call__
raise SystemExit(code)
SystemExit: None
>>>
Und dann kommt wieder "Tabelle nicht gefunden"... Haste mich ja schö veräppelt mit dem Schrott-Code.

Das eigentliche Problem was ich daraus lernen wollte, wie ich den Selector finde, was auf der Website etwas knifflig ist, davon hat hier auch überhaupt niemand Ahnung oder?

Dann dieses Getöne mit mach das Tutorial... Du ich habe hier ein Buch liegen für 40€ aber irgendwann muss man mal diese Welt von einfachst-Beispielen verlassen und was echtes ausprobieren...
Aus dem ganzen unsinnigen Geschreibsel hier habe ich nur eine Sache gelernt: Dass mein Gefühl über die for Schleife richtig war, sonst nichts...
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ThomasRandus: Du *musstest* keine AI fragen wegen dem `NameError`. Du hättest auch einfach die Grundlagen selber lernen können, statt immer nur andere zu fragen, ob nun AI oder Menschen. Das *muss* man wenn man tatsächlich programmieren möchte. Selber Wissen erarbeiten und sich nicht alles von anderen vorkauen und machen lassen.

Solange Du das nicht lernst, lernst Du halt nichts. 🤷‍♂️
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten