Seite 2 von 3
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 19:07
von Assassin4711
@ 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:
weiss du was falsch läuft?
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 19:39
von rogerb
@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.
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 21:38
von Assassin4711
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)
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 21:40
von Assassin4711
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")
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 22:31
von rogerb
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")
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 22:46
von Assassin4711
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)
Re: URL auf Webpage öffnen
Verfasst: Freitag 24. September 2021, 23:17
von rogerb
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.
Re: URL auf Webpage öffnen
Verfasst: Samstag 25. September 2021, 09:24
von Assassin4711
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.
Re: URL auf Webpage öffnen
Verfasst: Samstag 25. September 2021, 09:46
von Assassin4711
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")
Re: URL auf Webpage öffnen
Verfasst: Samstag 25. September 2021, 14:28
von Assassin4711
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?
Re: URL auf Webpage öffnen
Verfasst: Samstag 25. September 2021, 21:50
von Assassin4711
@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?
Re: URL auf Webpage öffnen
Verfasst: Samstag 25. September 2021, 22:04
von Assassin4711
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]
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 09:29
von rogerb
@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
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 16:16
von Assassin4711
Ja den Vorschlag habe ich auch wahrgenommen. Nur hatte ich keine Idee wie ich dann hinterher die spiel daten zu den passenden Quoten bringe.
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 17:30
von rogerb
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.
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 17:54
von Assassin4711
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.
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 19:42
von Assassin4711
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
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 20:15
von rogerb
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.
Re: URL auf Webpage öffnen
Verfasst: Sonntag 26. September 2021, 20:37
von Assassin4711
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 ...
Re: URL auf Webpage öffnen
Verfasst: Montag 27. September 2021, 20:15
von Assassin4711
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 ???