Beim Webscraping Datum filtern

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
robebo
User
Beiträge: 7
Registriert: Samstag 25. Juni 2022, 20:24

Hallo Zusammen,

ich bin noch ziemlicher Anfänger, habe mir aber ein Webscraping-Script gebastelt, das zu meiner bisherigen Zufriedenheit funktioniert. Mit dem Script werden mir Datensätze in eine csv geschrieben.

Jetzt möchte ich gerne die Variable ver_datum um einen Filtern ergänzen. Ziel ist es, dass ich nur Datensätze bekomme, die nach einem Datum liegen, dass ich vorab per Input eingebe Damit würden mir nicht mehr alle Datensätze, sondern immer nur die seit dem letzten Abzug hinzugekommenen Datensätz in die CSV geschrieben.

Hier konnte ich bislang nichts im Netz finden, wie ich das realisieren kann.

Könnt ihr mir helfen, per Code oder per Link auf einen Lösungsansatz/Handbuch/Tutorial?

Hier ist der Codeteil, der die Daten auf der Website ermittelt. Es geht um die Variable

Code: Alles auswählen

ver_datum

Code: Alles auswählen

from selenium import webdriver
    from selenium.webdriver.common.keys import Keys 
    import time
    from datetime import datetime
    import os
    from selenium.webdriver.support.ui import Select
    from selenium.webdriver.common.by import By
    import re
	
...

for k in range(4):
		ver_datum = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[1]')
		frist = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[2]')
		kurz_b = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[3]')
		typ_aus = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[4]')
		durch = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[5]')
		zweig = driver.find_element_by_xpath('//div[@id=\"content\"]/h2')
			
		
Vielen Dank.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@robebo: Wandel das Datum in ein `datetime.datetime`-Objekt um und lass Dir davon den `date`-Teil geben. Das kann man dann mit den üblichen Vergleichsoperationen mit anderen `datetime.date`-Objekten vergleichen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
robebo
User
Beiträge: 7
Registriert: Samstag 25. Juni 2022, 20:24

@blackjack: Vielen Dank. Ich lese mich mal in datetime ein.
robebo
User
Beiträge: 7
Registriert: Samstag 25. Juni 2022, 20:24

Ich habe mir datetime jetzt einmal angeschaut. Das hilft mir jedoch nicht weiter. So wie ich es verstehe, geht es darum Datumsangaben zu manipulieren, Strings in Datum übersetzen und zurück und Berechnungen mit Daten durchzuführen.

Was ich jedoch benötige ist Unterstützung bei der Formulierung einer Webscraping-Abfrage, die eine If-Bedingung beinhaltet.
Zur Erinnerung noch einmal, ich bin Python- und Programmierneuling.

Bezogen auf mein Webscraping-Projekt bedeutet dies:

schreibe mir nur die Datensätze in meine CSV-Datei, "if verdatum >= 'xx.xx.xxxx' "

Ich habe keine Ahnung, wie und wo ich das einbauen muss.

Vielleicht ist jemand so nett und hilft mir ein wenig auf die Sprünge....
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso denkst du, das wuerde dir nicht helfen? Du hast Strings in deinem Code, die willst du als Datum behandeln, und darueber einen Vergleich anstellen. Das ist also schon das richtige Vorgehen, dass dir __blackjack__ da nahegelegt hat.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich habe keine Ahnung, wie und wo ich das einbauen muss.
Ein date bzw. datetime Objekt kann in einer Liste sortiert werden. Beide Typen unterstützen die Vergleichsoperatoren. Deswegen sollst du die Funktion nutzen. Manchmal hat man Glück und es werden Datums-Strings im ISO8601-Format angeboten. Diese lassen sich lexikografisch sortieren.

Wenn es aber z.B. ein Datum ist, dass nicht dem Schema Jahr-Monat-Tag-Stunde-Minute-Sekunde entspricht, ist der lexikografische Vergleich falsch.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
robebo hat geschrieben: Montag 27. Juni 2022, 13:59 schreibe mir nur die Datensätze in meine CSV-Datei, "if verdatum >= 'xx.xx.xxxx' "
Okay, du hast den Hinweis auf 'datetime' und willst nun zwei Daten vergleichen. Da könnte man ziemlich schnell auf solche Vorlagen stoßen:
https://stackoverflow.com/questions/814 ... -two-dates


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
robebo
User
Beiträge: 7
Registriert: Samstag 25. Juni 2022, 20:24

Hallo und danke schon mal für eure Unterstützung,

ich denke, ich konnte noch nicht rüberbringen, an welcher Stelle mein Problem ansetzt. Ich versuche, es noch einmal genauer zu beschreiben.

Ich will mir Daten von einer Website laden, auf der Ausschreibungen veröffentlicht werden. Das möchte ich jeden Morgen für den Vortag tun.

Mein Script läuft soweit gut und holt mir der Website mit Seitenpaginierung die Listeneinträge und schreibt sie mir auch in eine CSV-Datei.
Damit habe ich aber auch viele unnötige Datensätze, wenn ich am nächsten Tag das Script erneut laufen lasse und wieder alle Seiten einlese.

Daher möchte ich das Veröffentlichungsdatum filtern, wozu die Website selber leider keine Filterfunktion bietet.

Hierfür sehe ich im Moment drei Möglichkeiten:

1. Ich mache es direkt beim Auslesen der Datensätze

Code: Alles auswählen

for k in range(4):
		ver_datum = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[1]')
2. Ich mache es, nachdem die Datensätze ausgelesen wurde und bevor die Datei geschrieben wird
3. Ich mache es in dem Moment, in dem die Datei geschrieben wird.

Am sinnvollsten erscheint mir die Variante 1.

Aber egal welche Variante funktionieren würde, ich habe leider keine Idee wie der Code für einen solchen Filter aussehen könnte.

Damit bin ich noch weit vor der Stelle, an der ich mich mit datetime und den dafür notwendigen Paramenter auseinandersetzen könnte.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@robebo: Du kennst Schleifen, Du kennst ``if``, Du weisst wie Du einen Datensatz aus dem HTML holst, wo ja das Datum als Text drin ist. Damit kennst Du alles was nötig ist. Ich denke hier haben jetzt alle ein Problem damit zu verstehen wo jetzt noch Dein Problem ist. Du hast alle Werkzeuge an der Hand die es hierfür braucht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast doch ver_datum als String. In welchem Format auch immer, so klar ist mir das nicht. Und dann kannst du das in ein datetime-Objekt wandeln, und dann vergleichen.

Code: Alles auswählen

gestern = datetime.date.today() - datetime.timedelta(days=1)
for k in range(4):
     ver_datum = driver.find_elements_by_xpath('//div[@id=\"contentContainer\"]//table/tbody/tr/td[1]')
     ver_datum = datetime.datetime.strptime(...).date()
     if ver_datum > gestern:
          ... 

Das ist also entgegen deiner Behauptung eben sehrwohl mit datetime zu loesen. Wieso also denkst du, dem waere nicht so? Statt dich damit auseinander zu setzen?
robebo
User
Beiträge: 7
Registriert: Samstag 25. Juni 2022, 20:24

Hallo deeds,

dein Codeschnipsel hat mir jetzt in zweierlei Hinsicht weitergeholfen. Ich weiß jetzt, dass ich direkt hinter der Abfrage von ver_datum weitermachen muss. Außerdem geht es dann an dieser Stelle mit einer if-Abfrage weiter.

Das hatte sich mir bisher nicht erschlossen.

Ich lese mich jetzt weiter ein. Vielen Dank.
Antworten