因此,我正在使用硒进行抓取,我想单击“防御性”部分中的“下一步”按钮,但是我编写的代码在“摘要”中单击了“下一步”。
这是您尝试使用的网址:
因此它正在选择“防御性”,我可以在窗口中看到它的选择,但没有出现下一页。单击“摘要”后,我发现下一个功能实际上正在发生。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser= webdriver.Chrome(executable_path ="C:\Program Files (x86)\Google\Chrome\chromedriver.exe")
browser.get('https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/7361/Stages/16368/PlayerStatistics/England-Premier-League-2018-2019')
browser.find_element_by_xpath("""//*[@id="stage-top-player-stats-options"]/li[2]/a""").click()
element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, """//*[@id="next"]""")))
browser.execute_script("arguments[0].click();", element)
答案 0 :(得分:0)
下一个按钮的xpath在此页面上不是唯一的。试试这个,
element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@id='stage-top-player-stats-defensive']//a[@id='next']")))
browser.execute_script("arguments[0].click();", element)
或
element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@id='stage-top-player-stats-defensive']//a[@id='next']")))
element.click()
答案 1 :(得分:0)
对于每个选项卡(摘要,防御,..),将新的下一个按钮添加到DOM中,并添加相同的id=next
。
选择“防御”,您将看到接下来的两个按钮具有相同的id=next
,选择“进攻”,将有三个下一步按钮。
使用基本的id=next
选择器,您始终单击“摘要”标签中的第一个下一个按钮。因为您使用的是JavaScript,但没有任何反应,请尝试使用Selenium click方法单击,您会收到错误消息。
要解决该问题,请调整您的选择器,使其更适合dom-#statistics-paging-defensive #next
。
此外,当您第一次打开页面时,会出现Cookie接受屏幕并阻止该页面,您可以使用以下方法将其跳过。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import selenium.common.exceptions as EX
def accept_cookies():
try:
WebDriverWait(browser, 20)\
.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.qc-cmp-button")))\
.click()
except EX.NoSuchElementException or EX.TimeoutException:
pass
#...
browser = webdriver.Chrome(executable_path ="C:\Program Files (x86)\Google\Chrome\chromedriver.exe")
browser.get('https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/7361/Stages/16368/PlayerStatistics/England-Premier-League-2018-2019')
wait = WebDriverWait(browser, 20)
browser.get(baseUrl)
accept_cookies()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[href='#stage-top-player-stats-defensive']"))).click()
next_button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#statistics-paging-defensive #next")))
next_button.click()
答案 2 :(得分:0)
*
,因为它会导致性能下降和元素查找时间延长document.getElementById('next').click()
的内容,他会使用鼠标假设以上所有内容,您都需要一个选择器,该选择器可以唯一标识next
标签上的Defensive
按钮,该按钮类似于:
//div[@id='statistics-paging-defensive']/descendant::a[@id='next']
参考文献: