Ausgabe
Ich versuche, einen automatischen Soundcloun-Player zu erstellen. Ich habe vor ein paar Tagen angefangen, Selen auf Python zu lernen, ich bin immer noch ein Anfänger. Ich möchte also eine Schleife erstellen, die funktioniert, wenn er die Seite betritt, auf “Ich akzeptiere” (für Cookies) klickt, dann die Leertaste drückt und nach 60 Sekunden aktualisiert
Hier ist der Code:
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from typing import KeysView
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.implicitly_wait(17)
driver.get("https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjkk_fNxM_6AhXrgc4BHWcSCjoQFnoECAYQAQ&url=https%3A%2F%2Fsoundcloud.com%2Fuser-997915825%2Fpmh-ah-aah&usg=AOvVaw2vFzZHA4d8DH1r5GjZ6e4y")
try:
element = driver.find_element(By.ID, 'onetrust-accept-btn-handler')
action = ActionChains(driver)
action.click(on_element = element)
action.perform()
driver.implicitly_wait(33)
except NoSuchElementException:
ActionChains(driver).key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
while True:
sleep(60)
driver.refresh()
Aber wenn ich try: then Except: NoSuchElementException einfüge, habe ich nicht einmal Zeit zum Dekompilieren, dass ich einen Fehler in den Zeilen erhalte wie: Try-Anweisung muss mindestens eine Ausnahme- oder Endgültig-Klausel haben. Pylance [Ln 17] Erwarteter Ausdruck. Pylanz [Ln 28]
Ich habe die richtigen Bibliotheken verwendet, denke ich:
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
Und schließlich, wenn ich versuche, es auszuführen, habe ich diesen netten Fehler: SyntaxError: expected 'except' or 'finally' block
.
Wenn ich versuche und außer wie folgt entferne:
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from typing import KeysView
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.implicitly_wait(17)
driver.get("https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjkk_fNxM_6AhXrgc4BHWcSCjoQFnoECAYQAQ&url=https%3A%2F%2Fsoundcloud.com%2Fuser-997915825%2Fpmh-ah-aah&usg=AOvVaw2vFzZHA4d8DH1r5GjZ6e4y")
element = driver.find_element(By.ID, 'onetrust-accept-btn-handler')
action = ActionChains(driver)
action.click(on_element = element)
action.perform()
driver.implicitly_wait(33)
ActionChains(driver).key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
while True:
sleep(60)
driver.refresh()
Er betritt die Seite, klickt auf „Ich akzeptiere“ und drückt dann die LEERTASTE, um mit dem Lesen zu beginnen, aber wenn er aktualisiert, beginnt er nicht einmal mit dem Lesen, da er kein „Cookie-Akzeptanz“-Fenster mehr hat. Deshalb suche ich nach Bedingungen. Ich habe mehrere Threads dazu durchsucht, ich habe versucht, ihren Code zu verstehen, bevor ich ihn kopiert habe, aber bisher sind alle Methoden, die ich versucht habe, fehlgeschlagen und es ist bereits 2 Tage dauernd, dass es mich blockiert, meine Augen beginnen zu schmerzen. Wenn jemand eine Lösung für mein Problem finden kann, würde ich mich freuen. Ich werde froh sein und das Problem finden können, oder ich bin das Problem.
Danke für deine Korrektur, Prophet, hier ist der neue Code:
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from typing import KeysView
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get("https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjkk_fNxM_6AhXrgc4BHWcSCjoQFnoECAYQAQ&url=https%3A%2F%2Fsoundcloud.com%2Fuser-997915825%2Fpmh-ah-aah&usg=AOvVaw2vFzZHA4d8DH1r5GjZ6e4y")
try:
element = driver.find_element(By.ID, 'onetrust-accept-btn-handler')
action = ActionChains(driver)
action.click(on_element = element)
action.perform()
except NoSuchElementException:
ActionChains(driver).key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
while True:
sleep(7)
driver.refresh()
Lösung
Ihnen fehlt der Einzug.
Dies ist eine sehr grundlegende Python-Syntaxregel.
Der Code innerhalb try
oder except
jedem anderen Block sollte relativ zum vorherigen Code eingerückt sein.
Mit der Einrückung könnte Ihr Code so aussehen:
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.implicitly_wait(17)
driver.get("https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjkk_fNxM_6AhXrgc4BHWcSCjoQFnoECAYQAQ&url=https%3A%2F%2Fsoundcloud.com%2Fuser-997915825%2Fpmh-ah-aah&usg=AOvVaw2vFzZHA4d8DH1r5GjZ6e4y")
try:
element = driver.find_element(By.ID, 'onetrust-accept-btn-handler')
action = ActionChains(driver)
action.click(on_element = element)
action.perform()
driver.implicitly_wait(33)
except NoSuchElementException:
ActionChains(driver).key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
Außerdem driver.implicitly_wait(33)
ist es kein Pausenbefehl.
driver.implicitly_wait
wird einmal pro Sitzung festgelegt. Legt das Timeout fest, wie lange versucht wird, ein Element auf der Seite zu finden (zusammenzufassen).
Wenn Sie eine Pause machen möchten, time.sleep()
sollte dies verwendet, aber nicht empfohlen werden, da wir im Allgemeinen nicht empfehlen, fest codierte Pausen im Selenium-Code zu verwenden.
Beantwortet von – Prophet
Antwort geprüft von – Gilberto Lyons (FixError Admin)