@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);"> </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?
URL auf Webpage öffnen
-
- 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]
@Assassin4711,
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.Müsste doch eigentlich so gehen oder. Habe ich ja im Code schon beim attribute class auch gemacht. Werde es morgen mal probieren.
Richtig, aus dem Grund hatte ich den Vorschlag gemacht erst alle Links in einer Liste zu Speichern und erst danach den einzelnen Links zu folgenEs ist wohl wirklich so das beim Seitenwechsel die Bezüge zur verlassenen Seite verloren gehen.
-
- 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.
Dazu könntest du alle Daten die du später noch benötigst auch in der Liste, oder in einem Dictionary, speichern.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.
-
- 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.
.. Spiel Ort / tunier / Spieler gibt es nämlich auch auf der Seite mit dem quoten.
-
- 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
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.
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.
-
- 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:
Das verstehe ich echt absolut nicht ... ich habe in der Belegung von "match_tbl" gar nichts geändert ... Ich könnte echt verzweifeln ...
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)
-
- User
- Beiträge: 77
- Registriert: Mittwoch 8. September 2021, 14:22
das klappt irgendwie noch nicht. Was mache ich falsch.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.
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"))
-
- 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:
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()