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

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

@ rogerb

Nochmal ganz ganz vielen Dank für deine Unterstützung. Ich habe jetzt den ersten python Part meines Tool hinbekommen. Und das nur weil du mir soviel geholfen hast.

Ein ganz großes DANKESCHÖN!!!

Und hier der fertige Teil des Tools:

Code: Alles auswählen

import datetime
import pandas as pd

from selenium import webdriver
from openpyxl import Workbook
from datetime import date
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wb = Workbook()
ws = wb.active
tomorrow = datetime.datetime.now() + datetime.timedelta(days=1)

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

# User Login
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("Password")

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

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

driver.get("https://www.oddsportal.com/matches/tennis/" + tomorrow.strftime("%Y%m%d") + "/")

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

urls = []

# 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]
        if "javascript:void(0);" not in a_tag.get_attribute("href"):
            urls.append(a_tag.get_attribute("href"))
        elif "javascript:void(0);" in a_tag.get_attribute("href"):
            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)
    #print(driver.find_element_by_css_selector("#breadcrumb > a:nth-child(4)").get_attribute('href'))
    df_sport = (WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#breadcrumb > a:nth-child(3)"))).get_attribute('text'))
    df_country = (WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#breadcrumb > a:nth-child(4)"))).get_attribute('text'))
    df_tournament = (WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#breadcrumb > a:nth-child(5)"))).get_attribute('text'))
    df_players = driver.find_element_by_tag_name("h1").text

    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")
            df_bookie = cells[0].text.replace("\n", "").strip()
            df_home_odd = cells[1].text.replace("\n", "").strip()
            df_away_odd = cells[2].text.replace("\n", "").strip()
            df_payout = cells[3].text.replace("\n", "").strip()
    
            print(df_sport , df_country , df_tournament , df_players , df_bookie , df_home_odd , df_away_odd , df_payout)
            ws.append([df_sport , df_country , df_tournament , df_players , df_bookie , df_home_odd , df_away_odd , df_payout])
                    
wb.save("F:\Testdatei\Tennis-" + tomorrow.strftime("%Y%m%d") + ".xlsx")
driver.close()

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

Na, also! Herzlichen Glückwunsch!
Antworten