MoveTargetOutOfBoundsException - Python 网页抓取

MoveTargetOutOfBoundsException - Python Web Scraping

我要抓取的网站的大部分内容都使用手风琴显示。我已经通过 class 名称“chevron-svg.left.chevron-down”识别了封闭的手风琴。我要全部打开,一共81个

我试过使用 'scrollIntoView',但出现 'MoveTargetOutOfBoundsException' 错误。做这个的最好方式是什么?我看到有人推荐 WebDriverWait,但我不确定如何实现它。

我的代码在下面,非常感谢对我做错了什么的建议。该网站和html也在下面的截图中。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

url = "https://sports.ladbrokes.com/event/basketball/american/nba/portland-trail-blazers-v-houston-rockets/230811255/all-markets"
driver = webdriver.Safari()
driver.maximize_window()
driver.get(url)

WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CLASS_NAME, "chevron-svg.left.chevron-down")))
elements = driver.find_elements_by_class_name("chevron-svg.left.chevron-down")

for element in elements:
    driver.execute_script("arguments[0].scrollIntoView();", element)
    ActionChains(driver).move_to_element(element).click().perform()

经过一些测试,我发现问题出在导航栏上:您使用“滚动到元素”滚动得太低,导航栏会拦截点击。为了解决这个问题,我刚刚将 scrollBy 添加到您的脚本中。 基本上,将 execute_script("arguments[0].scrollIntoView();", element) 更改为 execute_script("arguments[0].scrollIntoView(); window.scrollBy(0, -200);", element)

另外,我不知道你为什么不使用 element.click() 而不是 ActionChains(driver).move_to_element(element).click().perform(),对我来说效果很好。

我的测试函数是:

def test(url = URL_test):
    driver = webdriver.Chrome(options=chrome_options,
                              executable_path=Path('chromedriver.exe'))
    driver.maximize_window()
    try:
        driver.get(url)
        time.sleep(5) # wait for load, too lazy to do proper way
        elements = driver.find_elements_by_class_name("chevron-svg.left.chevron-down")
        for element in elements:
            header = element.find_element_by_xpath('../div[contains(@class, "accordion-")]/span[1]').text
            print(header) # to test which ones fail
            driver.execute_script("arguments[0].scrollIntoView(); window.scrollBy(0, -200);", element)
            element.click()
    except Exception as e:
        print(e)
        driver.save_screenshot("screenshot1.png")
        pass
    return driver