使用python和 selenium 进行网页抓取

flmtquvp  于 2022-12-13  发布在  Python
关注(0)|答案(2)|浏览(237)

我使用Selenium模块在Python中创建了一个小程序。
下面是我代码:

while True:
try:
    btnOptions = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/...."))).click()
    firstElement = driver.find_elements(By.XPATH, "//*[text()='Click']")
    if not firstElement:
        tnTrash = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[text()='Move']"))).click()
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,
                                                                    "/html/body/..."))).click()
    else:
        firstElement.click()
except NoSuchElementException:
    break

该循环应该:
第一步:找到按钮选项按钮-〉按钮选项= WebDriverWait(驱动程序,10).until(EC.element_to_be_clickable((By.XPATH,“/html/....”))).单击()
菜单打开,在该菜单中可以有元素1或元素2;永远不要同时使用这两种方法。例如,

element1 is : 
WebDriverWait(driver, 10).until(driver.find_elements(By.XPATH, "//*[text()='element1']"))
element2 is : 
WebDriverWait(driver, 10).until(driver.find_elements(By.XPATH, "//*[text()='element2']"))

步骤2:如果找到元素1,则单击它并从开始处重新开始循环。如果找到的是元素2,则单击它并从开始处重新开始循环。
如果是要删除的帖子,则元素1会出现在下拉菜单中;如果是个人资料照片,则元素2会出现在下拉菜单中。
目前,只要我的程序找到了元素1,它就会继续运行,如果元素2存在,它就会停止,并显示一个错误,告诉我没有找到元素1
我想到了这一点,但还是行不通:

while True:
try:
    btnOptions = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div..."))).click()
    WebDriverWait(driver, 20).until(driver.find_element(By.XPATH("//*[text()='move to trash']"))).click() or WebDriverWait(driver, 20).until(driver.find_element(By.XPATH("//*[text()='Do not show in profile']"))).click()
except NoSuchElementException:
    break
0pizxfdo

0pizxfdo1#

您可以尝试以下操作:

try:
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "my_element"))).click()
except:
    while True:
        try:
            btnOptions = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html/body/div["
                                                                                                   "1]/div/div["
                                                                                                   "1]/div/div["
                                                                                                   "5]/div/div/div["
                                                                                                   "3]/div/div/div["
                                                                                                   "1]/div["
                                                                                                   "1]/div/div/div["
                                                                                                   "4]/div[2]/div/div["
                                                                                                   "2]/div[3]/div["
                                                                                                   "3]/div/div/div/div"
                                                                                                   "/div/div/div/div/div"
                                                                                                   "/div/div["
                                                                                                   "8]/div/div/div["
                                                                                                   "2]/div/div["
                                                                                                   "3]/div/div")))
            time.sleep(2)
            btnOptions.click()
            time.sleep(2)
            btnTrash = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[text()='Déplacer "
                                                                                                 "dans la corbeille']")))
            time.sleep(1)
            btnTrash.click()
            time.sleep(1)
            btn_move = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,
                                                                                       "/html/body/div[1]/div/div["
                                                                                       "1]/div/div[ "
                                                                                       "6]/div/div/div[1]/div/div["
                                                                                       "2]/div/div/div/div/div/div/div["
                                                                                       "3]/div/div/div/div[1]")))
            time.sleep(1)
            btn_move.click()
            time.sleep(7)
        except NoSuchElementException:
            break

您尝试单击您的元素,如果确定,则代码将在except块后继续,如果单击失败,则意味着元素不存在,因此它将在except块中运行您预期的代码

gj3fmq9x

gj3fmq9x2#

验证元素是否存在的最简单的方法是使用find_elements方法,因为在这种情况下,如果没有找到元素,将不会抛出异常。
您的代码中有几个问题需要改进:
1.由于您在此处单击元素,因此应使用element_to_be_clickableexpected_conditions,而不是presence_of_element_located
1.使用WebDriverWaitexpected_conditions时,无需在操作之间添加休眠。
3)可以直接对返回的web元素对象执行click(),不需要放到临时变量中。
4)你的定位器应该得到改善,但我不能在这里帮助,因为我不知道你在哪个页面上工作。
因此,您的代码可以如下所示:

first_element_list = driver.find_elements(By.XPATH,"the_element_locator")
if first_element_list:
    first_element_list[0].click()
else:
    while True:
        try:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[1]/div/div[5]/div/div/div[3]/div/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div[2]/div[3]/div[3]/div/div/div/div/div/div/div/div/div/div/div[8]/div/div/div[2]/div/div[3]/div/div"))).click()
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//*[text()='Déplacer dans la corbeille']"))).click()
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,  "/html/body/div[1]/div/div[1]/div/div[6]/div/div/div[1]/div/div[2]/div/div/div/div/div/div/div[3]/div/div/div/div[1]"))).click()
        except NoSuchElementException:
            break

相关问题