【问题标题】:Loop through <a> tag of a web page with Selenium使用 Selenium 循环浏览网页的 <a> 标记
【发布时间】:2020-10-27 16:12:35
【问题描述】:

我正在使用 Selenium 使用 Python 构建网络爬虫。这是我从中抓取数据的网页:

如您所见,当我们单击标有数字的按钮时,此页面内的表格会发生变化。该页面是巴西基金报告。 “Anterior”的意思是“上一个”,“seguinte”的意思是下一个。我想遍历所有这些数字,但我尝试过的都没有奏效。我正在尝试使用 Selenium 中的 click() 方法单击标识 Seguinte 按钮的 &lt;a&gt; 标记。

我尝试了什么

browser = Firefox()

button = browser.find_element_by_id('tblDocumentosEnviados_next')
while button.is_enabled(): 
               
    page = browser.find_element_by_xpath('//a[contains(@class, "paginate_button current")]').text
    print(page)
    button = browser.find_element_by_id('tblDocumentosEnviados_next')
    time.sleep(3)
    button.click()

如何遍历这些数字?

【问题讨论】:

  • 你确定 selenium 是网络爬虫的正确工具吗?为此目的打开浏览器相当昂贵。
  • @DMart,我不知道,你觉得它太贵了吗?请分享你的想法

标签: python selenium loops


【解决方案1】:

如您所见,两个按钮之间的区别只是数量

//*[@id="tblDocumentosEnviados_paginate"]/span/a[1]
//*[@id="tblDocumentosEnviados_paginate"]/span/a[2]

如果您想遍历它,您可以简单地更改 xpath 中的数字

例如

 for i in range(1, numberOfPages):
browser.find_element_by_xpath("//[@id="tblDocumentosEnviados_paginate"]/span/a["+str(i)+"]")

希望这能解决你想要做的事情

【讨论】:

    【解决方案2】:

    我分析了网站发出的请求,发现您可以通过一个请求获取所有数据作为 json 内容:

    import requests as r
    from bs4 import BeautifulSoup
    import json
    url = "https://fnet.bmfbovespa.com.br/fnet/publico/abrirGerenciadorDocumentosCVM?cnpjFundo=11026627000138&idCategoriaDocumento=6&idTipoDocumento=45"
    
    res = r.get("http://fnet.bmfbovespa.com.br/fnet/publico/pesquisarGerenciadorDocumentosDados?d=0&s=0&l=200&"+url.split("?")[1])
    json_result = json.loads(res.text)
    print(json_result)
    

    注意:如果“recordsTotal”超过200,则需要再次请求参数“?d=0&s=200&l=200”,s代表start,l代表limit,始终保持200以刮一个请求中的最大值。

    【讨论】:

      【解决方案3】:

      在您使用button.click() 单击下一步按钮后,DOM 被刷新,button 变得陈旧。

      您需要在每次迭代时更新button。试试下面的代码:

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.common.exceptions import TimeoutException
      
      browser = Firefox()
      
      while True:
          try:
              button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.ID, "tblDocumentosEnviados_next")))
              page = browser.find_element_by_xpath('//a[contains(@class, "paginate_button current")]').text
              print(page)
              button.click()
          except TimeoutException:
              break
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多