python - Selenium 和 Python:如何查找按钮列表并在循环中单击它们
问题描述
有一个表格,其中包含我需要抓取的一些数据,但首先我需要为每一行单击一个按钮(表格内),以便我可以转到另一个框架,然后选择数据(更详细的一个)。
之后,我使用 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)
但我的兴趣是建立一个循环去点击每个按钮,一次一次。
这是一些 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-cri.htm
解决方案
我建议做的是创建一个您希望单击的按钮列表,首先创建一个通过 xpath 查找所有元素的变量。然后,有一个 for 循环遍历该列表以通过 get_attribute 找到按钮类。
然后,您需要从该列表中获取键并将它们放入变量中。最后,有另一个 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*
我在上面的代码中做了一些假设。查看您当前正在尝试的完整代码可能会有所帮助。
谢谢
推荐阅读
- python-2.7 - 从 csv 文件中提取法语字符并使用它们更新要素类 (ArcGIS 10.4 & Python 2.7.10)
- xamarin.android - Xamarin Android 异步崩溃
- java - Thorntail/swarm:不能使用 XAdatasources?
- php - 如何在 Lumen 中定义外观?
- intellij-idea - 使用带有 IntelliJ 的 Project Lombok 进行模糊方法调用
- javascript - Highcarts.js 系列标签对齐行为
- spring - Spring JPA :: 找不到能够从类型转换的转换器
- python - 替换字符串列中的数据框值,从另一列获取要替换的值
- php - file_get_contents(): http:// wrapper 在服务器配置中被allow_url_fopen=0 禁用
- python - python 3 (Qt) [Errno 13] 权限被拒绝。如何获取文件夹路径?