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
我要抓取的网站的大部分内容都使用手风琴显示。我已经通过 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