我是python和selenium的新学习者。我已经写了一个从多个页面提取数据的代码,但是代码中有一定的问题。
1.我不能打破while循环函数,它点击下一页,直到有一个选项。下一页元素在到达最后一页后禁用,但代码仍然运行。
xpath:'//按钮[@aria-label=“下一页”]'
全量程:class="awsui_icon_h11ix_31bp4_98 awsui_size-normal-mapped-height_h11ix_31bp4_151 awsui_size-normal_h11ix_31bp4_147 awsui_variant-normal_h11ix_31bp4_219"
1.我能够得到我想从网页中提取的数据列表,但当我从我的端关闭网页时,我得到了最后一页的数据,结束了while循环。
完整代码:
opts = webdriver.ChromeOptions()
opts.headless = True
driver = webdriver.Chrome(ChromeDriverManager().install())
base_url = "XYZ"
driver.maximize_window()
driver.get(base_url)
driver.set_page_load_timeout(50)
element = WebDriverWait(driver, 50).until(EC.presence_of_element_located((By.ID, 'all-my-groups')))
driver.find_element(by=By.XPATH, value = '//*[@id="sim-issueListContent"]/div[1]/div/div/div[2]/div[1]/span/div/input').send_keys('No Stock')
dfs = []
page_counter = 0
while True:
wait = WebDriverWait(driver, 30)
wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class, 'alias-wrapper sim-ellipsis sim-list--shortId')]")))
cards = driver.find_elements_by_xpath("//div[contains(@class, 'alias-wrapper sim-ellipsis sim-list--shortId')]")
sims = []
for card in cards:
sims.append([card.text])
df = pd.DataFrame(sims)
dfs.append(df)
print(page_counter)
page_counter+=1
try:
wait.until(EC.element_to_be_clickable((By.XPATH,'//button[@aria-label="Next page"]'))).click()
except:
break
driver.close()
driver.quit()
我也是,附上类的图像,对不起,我不能分享的URL,因为它的私有域。
2条答案
按热度按时间qxgroojn1#
最简单的选择是当“下一页”按钮丢失时,通过超时让
wait.until()
失败。假设页面的加载速度比这快得多,你可以把超时时间改为5秒,这样当你到达最后一个页面时,循环就会更快地结束。如果你的页面加载速度有时很慢,那么你应该确保超时时间不会意外地过早中断;如果加载时间一直很快,那么您可能可以使用更短的超时间隔。或者,你可以更仔细地浏览特定的目标网页,找到一些元素,a)总是存在的,b)可以用来确定我们是否在最后一页。然后你可以读取该元素的值,并决定是否在试图找到“下一页”按钮之前中断循环。这可以保存等待最后循环迭代的几秒钟(避免等待超时)但可能不值得这么麻烦。
gmxoilav2#
更改以下条件
如下面所示,pseduocode
@disabled
是diff,它将确保在按钮被禁用时退出while循环。