URL auf Webpage öffnen

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Assassin4711,
1. Problem: Wie kann ich die Variable data_field_player_link ermitteln
Dazu must du den Link zunächst "manuell" im HTML Code finden und dann kannst du diese Funktionen
https://selenium-python.readthedocs.io/ ... ments.html
verwenden um ihn per Selenium zu finden. Die Seite heißt ja auch "readthedocs" (kleiner Wink mit dem Zaunpfahl) :wink:
Wenn du den Link gefunden hast kannst du ihn wie sonst auch mit Selenium öffnen.
2. Problem: Wenn ich es schaffen würde die URL der jeweiligen Partie zu öffnen und dort die Daten auslesen könnte, wie komme ich dann wieder zurück an die Stelle wo ich vorher war?
Wenn du es einmal geschafft hast zur vorherigen Seite zu kommen, kannst du die gleiche Methode ja wieder verwenden.
kann man Selenium auch einen URL aus dem HTML Code extrahieren? Oder geht das nur mit beautifulsoap.
Das geht mit beiden, siehe oben verlinkte Funktionen für Selenium.
Wenn ja wie bekomme dann oben neben dem String im data_field_player auch noch die URL in data_field_player_link?
Das hängt davon ab wie die URL in den HTML Code eingebettet ist. Ich weiß aber nicht was "data_field_player" sein soll. Daher kann ich nicht mehr dazu sagen.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

@rogerb Danke schonmal für deine Rückmeldung

Das hängt davon ab wie die URL in den HTML Code eingebettet ist. Ich weiß aber nicht was "data_field_player" sein soll. Daher kann ich nicht mehr dazu sagen.
das ganze bezieht dich ja noch auf den vorab aufgeführten Code.
data_field_player ist quasi die Partie in der zu analysierenden tabelle. nur eben als string. dahinter sreckt dann noch dien url due ja eben auch gerne ermittrln würde.
Wenn du es einmal geschafft hast zur vorherigen Seite zu kommen, kannst du die gleiche Methode ja wieder verwenden.
Na du hast gut reden du kannst es ja ... ich habe das Gefühl, je mehr ich lese um so unwissender werde ich. ich schau mir jetzt erstmal das verlinkte Werk an.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

wenn ich doch vorab schon den string gelssen habe also
Spieler a - Spieler b (das wäre dann data_field_players_txt)

könnte ich doch ggfs. hiermit den link finden,oder?

data_field_players_link = driver.find_element_by_partial_link_text(data_field_players_txt)

Oder sehe ich das falsch? bin nicht am pc und kann es nicht testen.

p.s. die seite ist genau das was ich gesucht habe. gibg es sowas auvh für beautifulsoup?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich habe den erweiterten Code mit Kommentaren eingefügt. Ich hoffe du findest die Stelle wo es eingefügt werden muss.

Diese Funktionen habe ich verwendet:
https://selenium-python.readthedocs.io/ ... _attribute
https://selenium-python.readthedocs.io/ ... y-tag-name

Code: Alles auswählen

elif "dark" not in row.get_attribute("class"):
    cells = row.find_elements_by_tag_name("td")

    data_field_time = cells[0].text.replace("\n", "").strip()
    data_field_player = cells[1].text.replace("\n", "").strip()

    # erstes a-Tag:
    a_tag = cells[1].find_elements_by_tag_name("a")[0]

    # href Attribut
    url = a_tag.get_attribute("href")

    # die Seite laden
    driver.get(url)

    # jetzt kommt der Teil wo du die Spielerseite auswertest

    # wieder zurück auf die vorige Seite
    driver.get("https://www.oddsportal.com/matches/tennis/")
... ich habe das Gefühl, je mehr ich lese um so unwissender werde ich.
Ja genau, und es wir erst noch viel, viel schlimmer bevor es irgendwann dann wieder leichter und leichter wird. :D Über den Berg muss jeder, der gerne programmieren lernen möchte.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

boah vielen vielen Dank ... ich freue mich schon es morgen auszuprobieren.
Ja genau, und es wir erst noch viel, viel schlimmer bevor es irgendwann dann wieder leichter und leichter wird.  Über den Berg muss jeder, der gerne programmieren lernen möchte.
Aber mit so Jungs wie euch, fällt es viel viel leichter ...

Danke euch allen
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

@ rogerb

hab jetzt mal den Code bei mir eingebaut ... ich bekomme jetzt nachfolgenden Fehler angezeigt ...

Code: Alles auswählen


WebDriverException: Message: unknown error: unsupported protocol
  (Session info: chrome=93.0.4577.82)
 
 
und wenn ich mal mit print url andrucken lasse schreibt er das:

Code: Alles auswählen

javascript:void(0);
weiss du was falsch läuft?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Assassin4711,

die wenigsten Fehlermeldungen sind für sich alleine aussagekräftig. Du solltest immer die komplette Fehlermeldung und den zugehörigen Code zeigen.
Bei mir lief es ohne Fehler. Mehr kann ich leider nicht sagen.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Code: Alles auswählen

javascript:void(0);
---------------------------------------------------------------------------
WebDriverException                        Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_6708/126840585.py in <module>
     57             print (url)
     58             # die Seite laden
---> 59             driver.get(url)
     60 
     61             # jetzt kommt der Teil wo du die Spielerseite auswertest

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in get(self, url)
    331         Loads a web page in the current browser session.
    332         """
--> 333         self.execute(Command.GET, {'url': url})
    334 
    335     @property

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

WebDriverException: Message: unknown error: unsupported protocol
  (Session info: chrome=93.0.4577.82)
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from openpyxl import Workbook

import pandas as pd

wb = Workbook()
ws = wb.active

def iter_stripped_texts(elements, start_index=None, end_index=None):
    return (element.text.strip() for element in elements[slice(start_index, end_index)])

#def main():
driver = webdriver.Chrome('C:\webdrivers\Chromedriver.exe')
driver.get("https://www.oddsportal.com/matches/tennis/")

loginbtn = driver.find_element_by_xpath('//*[@id="user-header-r2"]/div[1]/button/span/span')
loginbtn.click()

username = driver.find_element_by_xpath('//*[@id="login-username1"]')
username.send_keys("usernamexyz")

password = driver.find_element_by_xpath('//*[@id="login-password1"]')
password.send_keys("passwordxyz")

login = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/form/div[3]/button/span/span')
login.click()

tomorrow = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/div/span/a[3]')
tomorrow.click()

# tabelle mit den Matches
match_table = driver.find_element_by_id("table-matches")
rows = match_table.find_elements_by_tag_name("tr")
    
for row in rows:
        if "dark" in row.get_attribute("class"):
            # dark: alle Zeilen die den Autragungsort enthalten
            cells = row.find_elements_by_tag_name("a")

            data_field_country = cells[0].text.replace("\n", "").strip()
            data_field_tournament = cells[1].text.replace("\n", "").strip()
            
            # usw.

        elif "dark" not in row.get_attribute("class"):
            cells = row.find_elements_by_tag_name("td")

            data_field_time = cells[0].text.replace("\n", "").strip()
            data_field_player = cells[1].text.replace("\n", "").strip()

            # erstes a-Tag:
            a_tag = cells[1].find_elements_by_tag_name("a")[0]

            # href Attribut
            url = a_tag.get_attribute("href")
            
            print (url)
            # die Seite laden
            driver.get(url)

            # jetzt kommt der Teil wo du die Spielerseite auswertest

            # wieder zurück auf die vorige Seite
            driver.get("https://www.oddsportal.com/matches/tennis/")
            
            if ":" in cells[2].text.replace("\n", "").strip() \
            or "w.o." in cells[2].text.replace("\n", "").strip() \
            or "int." in cells[2].text.replace("\n", "").strip():
                data_field_homeodd = cells[3].text.replace("\n", "").strip()
                data_field_awayodd = cells[4].text.replace("\n", "").strip()
            else:
                data_field_homeodd = cells[2].text.replace("\n", "").strip()
                data_field_awayodd = cells[3].text.replace("\n", "").strip()

            
            ws.append([data_field_country ,data_field_tournament , url , data_field_time , data_field_player , data_field_homeodd , data_field_awayodd , data_field_player_url])

#driver.close()
wb.save("F:\Testdatei\Tennisspiele_morgen.xlsx")
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Okay, versuch es mal so. Erst alle Spieler URLs in eine Liste speichern und dann der Reihe nach dahin springen.

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from openpyxl import Workbook

import pandas as pd

wb = Workbook()
ws = wb.active

def iter_stripped_texts(elements, start_index=None, end_index=None):
    return (element.text.strip() for element in elements[slice(start_index, end_index)])

#def main():
driver = webdriver.Chrome('C:\webdrivers\Chromedriver.exe')
driver.get("https://www.oddsportal.com/matches/tennis/")

loginbtn = driver.find_element_by_xpath('//*[@id="user-header-r2"]/div[1]/button/span/span')
loginbtn.click()

username = driver.find_element_by_xpath('//*[@id="login-username1"]')
username.send_keys("usernamexyz")

password = driver.find_element_by_xpath('//*[@id="login-password1"]')
password.send_keys("passwordxyz")

login = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/form/div[3]/button/span/span')
login.click()

tomorrow = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/div/span/a[3]')
tomorrow.click()

# tabelle mit den Matches
match_table = driver.find_element_by_id("table-matches")
rows = match_table.find_elements_by_tag_name("tr")

# Liste für Spielerurls anlegen
urls = []

for row in rows:
    if "dark" in row.get_attribute("class"):
        # dark: alle Zeilen die den Autragungsort enthalten
        cells = row.find_elements_by_tag_name("a")

        data_field_country = cells[0].text.replace("\n", "").strip()
        data_field_tournament = cells[1].text.replace("\n", "").strip()

        # usw.

    elif "dark" not in row.get_attribute("class"):
        cells = row.find_elements_by_tag_name("td")

        data_field_time = cells[0].text.replace("\n", "").strip()
        data_field_player = cells[1].text.replace("\n", "").strip()

        # erstes a-Tag:
        a_tag = cells[1].find_elements_by_tag_name("a")[0]

        # nicht direkt in auf die Spielerseite springen, sondern erst alle URLs in einer Liste speichern 
        urls.append(a_tag.get_attribute("href"))

        if (
            ":" in cells[2].text.replace("\n", "").strip()
            or "w.o." in cells[2].text.replace("\n", "").strip()
            or "int." in cells[2].text.replace("\n", "").strip()
        ):
            data_field_homeodd = cells[3].text.replace("\n", "").strip()
            data_field_awayodd = cells[4].text.replace("\n", "").strip()
        else:
            data_field_homeodd = cells[2].text.replace("\n", "").strip()
            data_field_awayodd = cells[3].text.replace("\n", "").strip()

# jetzt über alle URLs iterieren und auf jeder Spielerseite springen und wieder zurück springen
for url in urls:
    driver.get(url)

    # hier die Spielerseite aus werten
    driver.get("https://www.oddsportal.com/matches/tennis/")

# driver.close()
wb.save("F:\Testdatei\Tennisspiele_morgen.xlsx")
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Kommt immer noch der gleiche Fehler:

Code: Alles auswählen

---------------------------------------------------------------------------
WebDriverException                        Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_20952/1514402188.py in <module>
     72 # jetzt über alle URLs iterieren und auf jeder Spielerseite springen und wieder zurück springen
     73 for url in urls:
---> 74     driver.get(url)
     75 
     76     # hier die Spielerseite aus werten

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in get(self, url)
    331         Loads a web page in the current browser session.
    332         """
--> 333         self.execute(Command.GET, {'url': url})
    334 
    335     @property

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

WebDriverException: Message: unknown error: unsupported protocol
  (Session info: chrome=93.0.4577.82)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Bei mir tritt der Fehler nicht auf. Ich verwende allerdings nicht Chrome, sondern Firefox.

Bei dir liegt es an der Zeile

driver.get(url)

"unsupported protocol" könnte bedeuten, dass die URLs bei dir nicht korrekt sind.
Schau dir mal die Liste "urls" an und ob da strings beginnend mit "https:// "drin liegen.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Moin @rogerb

heute morgen geht es ... und funktioniert jetzt einwandfrei ...

Vielen vielen Dank

Aber glaube jetzt nicht das du mich los bist ;-)))

Werde jetzt mal die Auswertung der verlinkten Seiten einbauen.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Etwas zu früh gefreut. Ich habe ja quasi deine erste Variante genommen bei der die Daten aus der neuen URL direkt ermittelt werden. Also bei dem Test vorher hatte ich mir nur mal per Print die URL andrucken lassen. Und das hat sehr gut funktioniert. Wenn ich jetzt aber mit driver.get ... die Seite öffne geht einmal die Seite mit den Quoten auf und wieder zu ... aber dann kommt folgende Fehlermeldung:

Code: Alles auswählen

---------------------------------------------------------------------------
StaleElementReferenceException            Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_7680/1813438336.py in <module>
     38 
     39 for row in rows:
---> 40     if "dark" in row.get_attribute("class"):
     41         # dark: alle Zeilen die den Autragungsort enthalten
     42         cells = row.find_elements_by_tag_name("a")

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webelement.py in get_attribute(self, name)
    137         attributeValue = ''
    138         if self._w3c:
--> 139             attributeValue = self.parent.execute_script(
    140                 "return (%s).apply(null, arguments);" % getAttribute_js,
    141                 self, name)

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute_script(self, script, *args)
    632             command = Command.EXECUTE_SCRIPT
    633 
--> 634         return self.execute(command, {
    635             'script': script,
    636             'args': converted_args})['value']

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=93.0.4577.82)
Kann es sein das beim Sprung zwischen den Seiten der Bezug auf die Tabelle verloren geht?

Also z.B. der Part der über der Schleife steht:

Code: Alles auswählen

match_table = driver.find_element_by_id("table-matches")
rows = match_table.find_elements_by_tag_name("tr")

der Code sieht jetzt so aus:

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from openpyxl import Workbook

import pandas as pd

wb = Workbook()
ws = wb.active

def iter_stripped_texts(elements, start_index=None, end_index=None):
    return (element.text.strip() for element in elements[slice(start_index, end_index)])

#def main():
driver = webdriver.Chrome('C:\webdrivers\Chromedriver.exe')
driver.get("https://www.oddsportal.com/matches/tennis/")

loginbtn = driver.find_element_by_xpath('//*[@id="user-header-r2"]/div[1]/button/span/span')
loginbtn.click()

username = driver.find_element_by_xpath('//*[@id="login-username1"]')
username.send_keys("xxx")

password = driver.find_element_by_xpath('//*[@id="login-password1"]')
password.send_keys("xxx")

login = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/form/div[3]/button/span/span')
login.click()

tomorrow = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/div/span/a[3]')
tomorrow.click()

# tabelle mit den Matches
match_table = driver.find_element_by_id("table-matches")
rows = match_table.find_elements_by_tag_name("tr")

# Liste für Spielerurls anlegen
urls = []

for row in rows:
    if "dark" in row.get_attribute("class"):
        # dark: alle Zeilen die den Autragungsort enthalten
        cells = row.find_elements_by_tag_name("a")

        data_field_country = cells[0].text.replace("\n", "").strip()
        data_field_tournament = cells[1].text.replace("\n", "").strip()

        # usw.

    elif "dark" not in row.get_attribute("class"):
        cells = row.find_elements_by_tag_name("td")

        data_field_time = cells[0].text.replace("\n", "").strip()
        data_field_player = cells[1].text.replace("\n", "").strip()

        # erstes a-Tag:
        a_tag = cells[1].find_elements_by_tag_name("a")[0]
        # href Attribut
        data_field_player_url = a_tag.get_attribute("href")

        if (
            ":" in cells[2].text.replace("\n", "").strip()
            or "w.o." in cells[2].text.replace("\n", "").strip()
            or "int." in cells[2].text.replace("\n", "").strip()
        ):
            data_field_homeodd = cells[3].text.replace("\n", "").strip()
            data_field_awayodd = cells[4].text.replace("\n", "").strip()
        else:
            data_field_homeodd = cells[2].text.replace("\n", "").strip()
            data_field_awayodd = cells[3].text.replace("\n", "").strip()

        # die Seite laden
        driver.get(data_field_player_url)
        # jetzt kommt der Teil wo du die Spielerseite auswertest

        # wieder zurück auf die vorige Seite
        driver.get("https://www.oddsportal.com/matches/tennis/")   
                
        ws.append([data_field_country ,data_field_tournament , data_field_time , data_field_player , data_field_homeodd , data_field_awayodd , data_field_player_url])    
            
# jetzt über alle URLs iterieren und auf jeder Spielerseite springen und wieder zurück springen

# for url in urls:
#   driver.get(url)
#
#    # hier die Spielerseite aus werten
#    driver.get("https://www.oddsportal.com/matches/tennis/")
    
# driver.close()
wb.save("F:\Testdatei\Tennisspiele_neu.xlsx")
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Also ich hab jetzt nochmal ein wenig gegoogelt. Es ist wohl wirklich so das beim Seitenwechsel die Bezüge zur verlassenen Seite verloren gehen. Und man diese wieder irgendwie neu setzen muss ...
Ich habe aber leider noch nicht gefunden wie man sie wieder neu belegt.

Hatte gedachte diese Zeilen einfach zu wiederholen würde helfen, hat es aber nicht ....

Code: Alles auswählen

        match_table = driver.find_element_by_id("table-matches")
        rows = match_table.find_elements_by_tag_name("tr")
Der komplette Code sieht derzeit so aus:

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from openpyxl import Workbook

import pandas as pd

wb = Workbook()
ws = wb.active

def iter_stripped_texts(elements, start_index=None, end_index=None):
    return (element.text.strip() for element in elements[slice(start_index, end_index)])

#def main():
driver = webdriver.Chrome('C:\webdrivers\Chromedriver.exe')
driver.get("https://www.oddsportal.com/matches/tennis/")

loginbtn = driver.find_element_by_xpath('//*[@id="user-header-r2"]/div[1]/button/span/span')
loginbtn.click()

username = driver.find_element_by_xpath('//*[@id="login-username1"]')
username.send_keys("xxx")

password = driver.find_element_by_xpath('//*[@id="login-password1"]')
password.send_keys("xxx")

login = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/form/div[3]/button/span/span')
login.click()

tomorrow = driver.find_element_by_xpath('//*[@id="col-content"]/div[3]/div/div/span/a[3]')
tomorrow.click()

# tabelle mit den Matches
match_table = driver.find_element_by_id("table-matches")
rows = match_table.find_elements_by_tag_name("tr")

# Liste für Spielerurls anlegen
urls = []

for row in rows:
    if "dark" in row.get_attribute("class"):
        # dark: alle Zeilen die den Autragungsort enthalten
        cells = row.find_elements_by_tag_name("a")

        data_field_country = cells[0].text.replace("\n", "").strip()
        data_field_tournament = cells[1].text.replace("\n", "").strip()

        # usw.

    elif "dark" not in row.get_attribute("class"):
        cells = row.find_elements_by_tag_name("td")

        data_field_time = cells[0].text.replace("\n", "").strip()
        data_field_player = cells[1].text.replace("\n", "").strip()

        # erstes a-Tag:
        a_tag = cells[1].find_elements_by_tag_name("a")[0]
        # href Attribut
        data_field_player_url = a_tag.get_attribute("href")

        if (
            ":" in cells[2].text.replace("\n", "").strip()
            or "w.o." in cells[2].text.replace("\n", "").strip()
            or "int." in cells[2].text.replace("\n", "").strip()
        ):
            data_field_homeodd = cells[3].text.replace("\n", "").strip()
            data_field_awayodd = cells[4].text.replace("\n", "").strip()
        else:
            data_field_homeodd_avg = cells[2].text.replace("\n", "").strip()
            data_field_awayodd_avg = cells[3].text.replace("\n", "").strip()

        # die Seite laden
        driver.get(data_field_player_url)
        # jetzt kommt der Teil wo du die Spielerseite auswertest
        
        for row in driver.find_elements_by_css_selector("#odds-data-table > div:nth-child(1) > table > tbody > tr"):        
            if not "wool" in row.get_attribute("class"):
                cells = row.find_elements_by_tag_name("td")
                data_field_bookie, data_field_home_odd, data_field_away_odd, data_field_payout = iter_stripped_texts(cells, 0, 4)    
        
        print([data_field_country , data_field_tournament , data_field_time , data_field_player , data_field_homeodd_avg , data_field_awayodd_avg , data_field_player_url , data_field_bookie , data_field_home_odd , data_field_away_odd , data_field_payout])
        # ws.append([data_field_country , data_field_tournament , data_field_time , data_field_player , data_field_homeodd_avg , data_field_awayodd_avg , data_field_player_url , data_field_bookie , data_field_home_odd , data_field_away_odd , data_field_payout])
        # wieder zurück auf die vorige Seite
        driver.get("https://www.oddsportal.com/matches/tennis/")
        
        match_table = driver.find_element_by_id("table-matches")
        rows = match_table.find_elements_by_tag_name("tr")
Hat jemand eine Idee wie ich wenn ich auf die Ursprungsseite zurückkehre wieder zurück in meine eigentlich Schleife komme um die Zeilen weiter durchzugehen?
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

@rogerb

Ich glaube ich weiss jetzt woran es liegen könnte. Im html ist das erste a> mit href nicht immer der Link. Manchmal sieht es da so aus:

<a href="javascript:void(0);" id="tv-pvmOXnJT" class="ico-tv-tournament" style="display:none;" onmouseout="allowHideTootip(true);delayHideTip(2000);">&nbsp;</a>

<a href="/tennis/kazakhstan/wta-nur-sultan/vikhlyantseva-natalia-niculescu-monica-pvmOXnJT/">Vikhlyantseva N. - Niculescu M.</a>

Kann ich irgendwie sagen
if text in a> is "javascript:void(0)"
dann nehme den zweiten a href eintrag

?
Wie kann ich das abfragen? Hast du dazu noch eine Idee?
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Müsste doch eigentlich so gehen oder. Habe ich ja im Code schon beim attribute class auch gemacht. Werde es morgen mal probieren.

Code: Alles auswählen

if "javascript" in row.get_attribute("a"):
    a_tag = cells[1].find_elements_by_tag_name("a")[1]
    
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Assassin4711,
Müsste doch eigentlich so gehen oder. Habe ich ja im Code schon beim attribute class auch gemacht. Werde es morgen mal probieren.
ja, das könnte funktionieren. Diese Tabelle ist sehr dynamisch aufgebaut. Unter bestimmten Umständen können mal mehrere Links vorhanden sein. Das muss man entsprechend bei der Auswertung der Tabelle berücksichtigen.
Es ist wohl wirklich so das beim Seitenwechsel die Bezüge zur verlassenen Seite verloren gehen.
Richtig, aus dem Grund hatte ich den Vorschlag gemacht erst alle Links in einer Liste zu Speichern und erst danach den einzelnen Links zu folgen
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Ja den Vorschlag habe ich auch wahrgenommen. Nur hatte ich keine Idee wie ich dann hinterher die spiel daten zu den passenden Quoten bringe.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Assassin4711 hat geschrieben: Sonntag 26. September 2021, 16:16 Nur hatte ich keine Idee wie ich dann hinterher die spiel daten zu den passenden Quoten bringe.
Dazu könntest du alle Daten die du später noch benötigst auch in der Liste, oder in einem Dictionary, speichern.
Antworten