嗨,我是网络抓取的新手,并且一直在尝试使用Selenium在python中抓取forum
我想让Selenium单击“下一步”直到最后一页,但我不知道如何打破循环。我在定位器上遇到了麻烦:
当我通过部分链接找到下一个按钮时,自动点击将继续到下一个帖子,例如page1-> page2-> next thread-> page1 of next thread - >下一个主题的第2页
while True:
next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Next")))
next_link.click()
当我通过班级名称找到下一个按钮时,自动点击会在到达最后一页时点击“上一步”按钮
while True:
next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
next_link.click()
我的问题是:
答案 0 :(得分:0)
您可以使用任何提供唯一标识的定位器。最佳实践说明了以下顺序。
当找不到你可以使用的元素时,在while循环中出现try block,如下所示。 break命令用于相同的。
while True:
try:
next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
next_link.click()
except TimeoutException:
break
答案 1 :(得分:0)
您需要考虑以下几点:
click()
而不是 expected-conditions 作为presence_of_element_located()
,您需要使用element_to_be_clickable()
。click()
块中调用try-catch
并且有例外break
。以下是工作代码块:
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
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://forums.hardwarezone.com.sg/money-mind-210/hdb-fully-paid-up-5744914.html")
driver.find_element_by_xpath("//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a").click()
while True:
try :
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a[contains(.,'Next')]"))).click()
except :
print("No more pages left")
break
driver.quit()
控制台输出:
No more pages left
答案 2 :(得分:0)
您可以使用以下代码单击“下一步”按钮,直到到达最后一页,如果该按钮不存在则中断循环:
from selenium.common.exceptions import TimeoutException
while True:
try:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next ›"))).click()
except TimeoutException:
break