[英]Selenium & Python: how to find a list of buttons and click them in a loop
有一個表格,其中包含一些我需要抓取的數據,但首先我需要為每一行單擊一個按鈕(表格內),這樣我就可以將 go 轉到另一個框架,然后選擇數據(更詳細的一個)。
之后,我使用 driver.back() 並單擊下一步按鈕,但我沒有得到它。
這是我嘗試獲取按鈕列表然后構建循環的內容:
list_buttons_consult_cri = WebDriverWait(driver, 10).until(EC.presence_of_elements_located((By.XPATH, "//a[@class='btn btn-black btn--small btn-registro']")))
但它不起作用,它給了我一個包含 [0] 元素的列表。
還嘗試使用 By.CLASS 來查找元素
當我嘗試這個時,我可以通過第一個按鈕:
button_cri = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[@class='btn btn-black btn--small btn-registro']")))
driver.execute_script("arguments[0].click();", button_cri)
但我的興趣是建立一個循環到 go 並單擊每個按鈕,一次一次。
以下是一些 html(a 標簽中的前兩個按鈕):
<table id="resultEmissaoCri" class="table table--black">
<thead>
<tr>
<th scope="col" class="no-break">Companhia Emissora</th>
<th scope="col" class="no-break">Agente Fiduciário</th>
<th scope="col" class="break-column">Nº Emissão</th>
<th scope="col" class="no-break">Tipo de Oferta </th>
<th scope="col" class="no-break">Código CETIP</th>
<th scope="col" class="break-column">Nº Série</th>
<th scope="col" class="no-break">Tipo de Série</th>
<th scope="col" class="no-break">Vl. Global Série<br>(R$ em milhões)</th>
<th scope="col" class="no-break">Vl. Total Oferta<br>(R$ em milhões)</th>
<th scope="col" class="break-column">Data de Emissão</th>
<th scope="col" class="no-break">Identificação do CRI</th>
<th scope="col" class="no-break"></th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Companhia Emissora" data-type="fantasiaEmissor">RB CAPITAL COMPANHIA DE SECURITIZACAO</td>
<td data-label="Agente Fiduciário" data-type="nomeAgenteFiduciario">OLIVEIRA TRUST DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS S.A.</td>
<td data-label="Nº Emissão" data-type="numEmissao">1</td>
<td data-label="Tipo de Oferta " data-type="indTipoOferta">Pública de Esforços Restritos</td>
<td data-label="Código CETIP" data-type="codCETIP"></td>
<td data-label="Nº Série" data-type="numSerie">296</td>
<td data-label="Tipo de Série" data-type="indTipoCRI">Série Única</td>
<td data-label="Vl. Global Série (R$ em milhões)" data-type="valorGlobalSerie" class="align-right">21,54</td>
<td data-label="Vl. Total Oferta (R$ em milhões)" data-type="valorTotalOferta" class="align-right">21,53</td>
<td data-label="Data de Emissão" data-type="dataEmissao">06/11/2020</td>
<td data-label="Identificação do CRI" data-type="descrIdentificacaoCRI" class="break-row">1407</td>
<td data-label="" data-type="button">
<div class="table__buttons"><a class="btn btn-black btn--small btn-registro" title="Dados Emissão" href="/emissao/1407/1/296"><i class="fa fa-file-text-o" aria-hidden="true"></i></a><a class="btn btn-black btn--small btn-dados" title="Dados Periódicos" href="/periodica/1407/1/296"><i class="fa fa-calendar" aria-hidden="true"></i></a></div>
</td>
</tr>
<tr>
<td data-label="Companhia Emissora" data-type="fantasiaEmissor">RB CAPITAL COMPANHIA DE SECURITIZACAO</td>
<td data-label="Agente Fiduciário" data-type="nomeAgenteFiduciario">VORTX DTVM LTDA</td>
<td data-label="Nº Emissão" data-type="numEmissao">1</td>
<td data-label="Tipo de Oferta " data-type="indTipoOferta">Pública de Esforços Restritos</td>
<td data-label="Código CETIP" data-type="codCETIP"></td>
<td data-label="Nº Série" data-type="numSerie">303</td>
<td data-label="Tipo de Série" data-type="indTipoCRI">Série Única</td>
<td data-label="Vl. Global Série (R$ em milhões)" data-type="valorGlobalSerie" class="align-right">20,00</td>
<td data-label="Vl. Total Oferta (R$ em milhões)" data-type="valorTotalOferta" class="align-right">20,00</td>
<td data-label="Data de Emissão" data-type="dataEmissao">29/10/2020</td>
<td data-label="Identificação do CRI" data-type="descrIdentificacaoCRI" class="break-row">1403</td>
<td data-label="" data-type="button">
<div class="table__buttons"><a class="btn btn-black btn--small btn-registro" title="Dados Emissão" href="/emissao/1403/1/303"><i class="fa fa-file-text-o" aria-hidden="true"></i></a><a class="btn btn-black btn--small btn-dados" title="Dados Periódicos" href="/periodica/1403/1/303"><i class="fa fa-calendar" aria-hidden="true"></i></a></div>
</td>
如果有人想要,還有 html 的鏈接: https://www.anbima.com.br/pt_br/informar/dados-de-emissao-de-crihs。
我建議做的是創建一個您希望單擊的按鈕列表,首先創建一個變量,該變量通過 xpath 找到所有元素。 然后,有一個 for 循環遍歷該列表以通過 get_attribute 找到按鈕 class。
然后,您需要從該列表中獲取鍵並將它們放入變量中。 最后,有另一個 for 循環遍歷列表中的每個項目並執行您想要的操作。 請參見下面的示例。
buttons = []
button_cri = driver.find_elements(By.XPATH, '(//a[@class="btn btn-black btn--small btn-registro"])')
for i in range(len(button_cri)):
buttons.append(button_cri[i].get_attribute("button"))
all_buttons = list(dict.fromkeys(buttons))
for b in all_buttons:
driver.get(b)
*Rest of your code here*
我在上面的代碼中做了一些假設。 查看您當前正在嘗試的完整代碼可能會有所幫助。
謝謝
對於每一行,您應該獲得按鈕,單擊它,獲取您的數據,然后返回。 這里有一個例子:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
table = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.XPATH, "//table")))
trs = WebDriverWait(table, 10).until(ec.presence_of_all_elements_located((By.XPATH, ".//tr")))
for i in range(len(trs)):
table = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.XPATH, "//table")))
trs = WebDriverWait(table, 10).until(ec.presence_of_all_elements_located((By.XPATH, ".//tr")))
tds = WebDriverWait(trs[i], 10).until(ec.presence_of_all_elements_located((By.XPATH, ".//td")))
last_td = tds[-1]
button = WebDriverWait(last_td, 10).until(ec.element_to_be_clickable((By.XPATH, ".//a[@class='btn btn-black btn--small btn-registro']")))
button.click()
#get your data
driver.back()
要獲取元素list
,您必須使用presence_of_all_elements_located
()
list_buttons_consult_cri = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//a[@class='btn btn-black btn--small btn-registro']")))
要讓所有 11 個按鈕單擊並返回 go,請執行以下操作。
driver.get("https://www.anbima.com.br/pt_br/informar/dados-de-emissao-de-cri.htm")
wait=WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#LGPD_ANBIMA_global_sites__text__btn"))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, 'full')))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-black.right"))).click()
i=1
while True:
try:
#print("/html/body/div[1]/div/div/div/main/table/tbody/tr[{}]/td[12]/div/a[1]".format(i))
elem=wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div/div/main/table/tbody/tr[{}]/td[12]/div/a[1]".format(i))))
driver.execute_script("arguments[0].click();", elem)
i+=1
driver.back()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, 'full')))
except Exception as e:
print(e)
break
這將執行以下操作:
進口
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.