首页 > 解决方案 > Python/Selenium - 迭代到下一行

问题描述

我的代码进入了一个网站,并且有一个表格,其中每一都有一个 javascript 窗口,当您单击它时会弹出该窗口

我希望我的代码迭代并单击每一行,这将提示打开第二个窗口,执行一些操作,然后关闭此窗口并移至下一行。

但是,当我关闭第一个窗口时,我的代码会循环,它会再次单击第一行。永远不要移动到第 2 行。

from selenium import webdriver

from bs4 import BeautifulSoup
import pandas as pd
import time
import requests
driver = webdriver.Chrome()
vals=[]
finalz=[]
productlink=[]
driver.get('https://aaaai.planion.com/Web.User/SearchSessions?ACCOUNT=AAAAI&CONF=AM2021&USERPID=PUBLIC&ssoOverride=OFF')
time.sleep(3)
page_source = driver.page_source
soup = BeautifulSoup(page_source,'html.parser')
productlist=soup.find_all('tr',class_='clickdiv')

for item in productlist:
    ea = item.find_all('td')
    title=ea[0].text
    sam=driver.find_element_by_class_name('clickdiv') #opens the window
    sam.click()
    time.sleep(1)
    cl=driver.find_element_by_class_name('XX') #this is the close window button
    cl.click()

标签: pythonseleniumweb-scraping

解决方案


当您编写代码时,sam=driver.find_element_by_class_name('clickdiv')将始终找到第一行。驱动程序位于带有表格的页面上,并且正在该页面上搜索具有“clickdiv”类的第一个元素,因为您使用find_element_by_class_name()的是find_elements_by_class_name(). 所以,它只是找到第一个具有“clickdiv”类的东西,它是表格的第一行。

您应该使用 Selenium 驱动程序找到所有这些元素,然后遍历这些行并单击它们,而不是使用 BeautifulSoup 来识别要迭代的所有行。

productlist = driver.find_elements_by_class_name('clickdiv')

for item in productlist:
   title = item.find_element_by_css_selector("td").text
   item.click()
   time.sleep(1)
   driver.find_element_by_class_name('XX').click() #close window 

推荐阅读