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.
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.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Ich überlege gerade ob ich von der ersten Seite nur die links in die Liste lade und dann alle Daten von der zweiten Seite nehme. Dann kann ich mir den Datensatz so aufbauen wie ich will
.. Spiel Ort / tunier / Spieler gibt es nämlich auch auf der Seite mit dem quoten.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Was mache ich falsch?

Code: Alles auswählen

for row in rows:
    if "dark" not in row.get_attribute("class"):
        cells = row.find_elements_by_tag_name("td")
        if "javascript" not in row.get_attribute("a"):
            a_tag = cells[1].find_elements_by_tag_name("a")[0] 
            urls.append(a_tag.get_attribute("href"))
        elif "javascript" in row.get_attribute("a"):
            a_tag = cells[1].find_elements_by_tag_name("a")[1] 
            urls.append(a_tag.get_attribute("href"))
            
for url in urls:
   print(url)

Code: Alles auswählen

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_2676/3366483776.py in <module>
     34     if "dark" not in row.get_attribute("class"):
     35         cells = row.find_elements_by_tag_name("td")
---> 36         if "javascript" not in row.get_attribute("a"):
     37             a_tag = cells[1].find_elements_by_tag_name("a")[0]
     38             urls.append(a_tag.get_attribute("href"))

TypeError: argument of type 'NoneType' is not iterable

rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Der Funktionsaufruf row.get_attribute("a") liefert kein Ergebnis, ist also None.
Denn die Abfrag mit "in" oder "not in" setzt voraus, dass es sich bei dem Objekt worin gesucht werden soll, nicht um None sondern ein iterable handelt, also eine Liste oder Tupel.

Das bedeutet wahrscheinlich, dass row kein Attribut "a" enthält. Das macht auch Sinn, denn "a" ist kein HTML Attribut sondern ein HTML-Tag.
Will man das a-Tag finden, wäre row.find_elements_by_tag_name("a") das Mittel der Wahl.
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

Wiedermal danke ... aber gerade verzweifel ich wirklich ... Kann es sein dass, das HTML lesen irgendwie ziemlich wackelig ist ... ich bekomme jetzt die ganze zeit eine Fehlermeldung wo ich bis dato nie eine erhalten habe:

Code: Alles auswählen

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

import pandas as pd

# Browser verbinden
driver = webdriver.Chrome('C:\webdrivers\chromedriver.exe')
driver.get("https://www.oddsportal.com/login/")

urls = []

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

# Benutzer einloggen
username = driver.find_element_by_xpath('//*[@id="login-username1"]')
username.send_keys("Username")

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

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

driver.get("https://www.oddsportal.com/matches/tennis/")

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

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

# Tabelle analysieren und Daten ermitteln
for row in rows:
    if "dark" not in row.get_attribute("class"):
        cells = row.find_elements_by_tag_name("td")
        a_tag = cells[1].find_elements_by_tag_name("a")[0] 
        urls.append(a_tag.get_attribute("href"))

#        if "javascript" not in row.get_attribute("a"):
#            a_tag = cells[1].find_elements_by_tag_name("a")[0] 
#            urls.append(a_tag.get_attribute("href"))
#        elif "javascript" in row.get_attribute("a"):
#            a_tag = cells[1].find_elements_by_tag_name("a")[1] 
#            urls.append(a_tag.get_attribute("href"))
            
for url in urls:
    driver.get(url)
    data_field_country = driver.find_element_by_css_selector('#breadcrumb > a:nth-child(4)')

    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)
                
                #data_field_tournament = driver.find_element_by_xpath('/html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[1]/a[4]')
                #data_field_players = driver.find_element_by_xpath('/html/body/div[1]/div/div[2]/div[6]/div[1]/div/div[1]/div[2]/div[1]/h1')

                print (
                data_field_country , \
                #data_field_tournament , \
                #data_field_players , \
                data_field_bookie , \
                data_field_home_odd , \
                data_field_away_odd , \
                data_field_payout)

Code: Alles auswählen


---------------------------------------------------------------------------
NoSuchElementException                    Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_2676/2052878460.py in <module>
     31 
     32 # Tabelle mit den Matches
---> 33 match_tbl = driver.find_element_by_id("table-matches")
     34 rows = match_tbl.find_elements_by_tag_name("tr")
     35 

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element_by_id(self, id_)
    358             element = driver.find_element_by_id('foo')
    359         """
--> 360         return self.find_element(by=By.ID, value=id_)
    361 
    362     def find_elements_by_id(self, id_):

~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value)
    974                 by = By.CSS_SELECTOR
    975                 value = '[name="%s"]' % value
--> 976         return self.execute(Command.FIND_ELEMENT, {
    977             'using': by,
    978             'value': value})['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):

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="table-matches"]"}
  (Session info: chrome=93.0.4577.82)


Das verstehe ich echt absolut nicht ... ich habe in der Belegung von "match_tbl" gar nichts geändert ... Ich könnte echt verzweifeln ...
Assassin4711
User
Beiträge: 77
Registriert: Mittwoch 8. September 2021, 14:22

rogerb hat geschrieben: Sonntag 26. September 2021, 20:15 Der Funktionsaufruf row.get_attribute("a") liefert kein Ergebnis, ist also None.
Denn die Abfrag mit "in" oder "not in" setzt voraus, dass es sich bei dem Objekt worin gesucht werden soll, nicht um None sondern ein iterable handelt, also eine Liste oder Tupel.

Das bedeutet wahrscheinlich, dass row kein Attribut "a" enthält. Das macht auch Sinn, denn "a" ist kein HTML Attribut sondern ein HTML-Tag.
Will man das a-Tag finden, wäre row.find_elements_by_tag_name("a") das Mittel der Wahl.
das klappt irgendwie noch nicht. Was mache ich falsch.

Code: Alles auswählen

        if "javascript:void(0);" not in row.find_elements_by_tag_name("a"):
            a_tag = cells[1].find_elements_by_tag_name("a")[0] 
            urls.append(a_tag.get_attribute("href"))
        elif "javascript:void(0);" in row.find_elements_by_tag_name("a"):
            a_tag = cells[1].find_elements_by_tag_name("a")[1] 
            urls.append(a_tag.get_attribute("href"))
Wahrscheinlich lese ich mit row.find_elements_by_tag_name nicht den value aus, oder ???
Antworten