如何使用Selenium在iframe中自动单击多个链接?

2024-03-28 19:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从以下网站收集秘鲁国会提出的几项法案的数据:http://www.congreso.gob.pe/pley-2016-2021

基本上,我想点击搜索结果中的每个链接,刮取账单的相关信息,返回搜索结果,然后点击下一个账单的下一个链接并重复这个过程。很明显,国会会议期间有这么多法案,如果我能自动完成这项工作,那就太好了。你知道吗

到目前为止,我已经能够完成一切,直到点击下一个法案。我已经能够使用Selenium启动一个显示搜索结果的web浏览器,使用iframe中嵌入的xpath单击第一个链接,然后使用beautifulsoup刮取内容,然后导航回搜索结果。我遇到的问题是,我无法在搜索结果中单击下一个账单,因为我不确定如何迭代xpath(或者如何迭代将我带到每个后续账单的内容)。我想能够为每一页上的所有法案的信息刮,然后能够导航到搜索结果的下一页。你知道吗

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
from bs4 import BeautifulSoup
import requests

driver = webdriver.Chrome('C:\\Users\\km13\\chromedriver.exe')
driver.get("http://www.congreso.gob.pe/pley-2016-2021")


WebDriverWait(driver, 50).until(EC.frame_to_be_available_and_switch_to_it((By.NAME, 'ventana02')))

elem = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
(By.XPATH, "//a[@href='/Sicr/TraDocEstProc/CLProLey2016.nsf/641842f7e5d631bd052578e20058a231/243a65573d33ecc905258449007d20cc?OpenDocument']")))
elem.click()

soup = BeautifulSoup(driver.page_source, 'lxml')
table = soup.find('table', {'bordercolor' : '#6583A0'})
table_items = table.findAll('font')
table_authors = table.findAll('a')
for item in table_items:
content = item.contents[0]
print(content)
for author in table_authors:
authors = author.contents[0]
print(authors)
driver.back()

到目前为止,这是我的代码,启动网页浏览器,点击搜索结果的第一个链接,刮取必要的数据,然后返回到搜索结果。你知道吗

以下代码将导航到搜索结果中的不同页面:

elem = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
(By.XPATH, "//a[contains(@onclick,'D32')]/img[contains(@src,'Sicr/TraDocEstProc/CLProLey')]")))
elem.click()

我想我的具体问题是如何在iframe中自动单击后续账单,因为一旦我能够做到这一点,我就假设我可以循环每个页面上的账单,然后将该循环嵌套在一个函数中,该函数循环搜索结果的页面。你知道吗

更新:在下面答案的帮助下,我应用了逻辑,但使用beautifulsoup在iframe中刮取href链接,并将它们存储在一个列表中,该列表连接了必要的字符串元素,从而为页面上的所有账单创建xpath列表:

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
from bs4 import BeautifulSoup
import requests

driver = webdriver.Chrome('C:\\Users\\km13\\chromedriver.exe')
driver.get("http://www.congreso.gob.pe/pley-2016-2021")


WebDriverWait(driver, 50).until(EC.frame_to_be_available_and_switch_to_it((By.NAME, 'ventana02')))

soup = BeautifulSoup(driver.page_source, 'lxml')
table = soup.find('table', {'cellpadding' : '2'})
table_items = table.find_all('a')
for item in table_items:
    elem = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
    (By.XPATH, "//a[@href='" + item.get('href') + "']")))
    elem.click()
    driver.back()

现在我的问题是,它将单击循环中第一个项目的链接并单击返回到搜索结果,但不会继续单击循环中的下一个项目(代码只是超时)。我对用Python编写循环也很陌生,所以我想知道是否有一种方法可以让我遍历xpath的条目,这样我就可以单击一个xpath,在该页面上刮取信息,单击返回搜索结果,然后单击列表中的下一个条目?你知道吗


Tags: tofromimportby链接driverseleniumtable
1条回答
网友
1楼 · 发布于 2024-03-28 19:27:05

你知道吗 这是我解决这个问题的逻辑。你知道吗

1。首先使用switchTo进入Iframe。你知道吗

2。使用获取xpath“//a”的webelements驱动程序.findElements由于此框架仅具有用于票据的链接,因此将其添加到变量“billLinks”中。你知道吗

3。现在遍历billLinks并执行所需的操作。你知道吗

我希望这个解决办法有用。你知道吗

相关问题 更多 >