【问题标题】:Webscraping in Python Selenium - Can't find buttonPython Selenium 中的网页抓取 - 找不到按钮
【发布时间】:2020-08-22 04:11:23
【问题描述】:

所以,我试图从这个网页http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm 访问一些数据。我试图用硒单击名为“Setor de atuação”的按钮。问题是请求库返回的 HTML 与我检查页面时看到的不同。我已经尝试在请求中发送标头,但这不是解决方案。虽然,当我在

中打印内容时
browser.page_source

我仍然得到我想要的页面的不完整部分。为了尝试解决问题,我看到在网站初始化时发布了两个请求: print1

嗯,我不知道现在该做什么。如果有人可以帮助我或向我发送教程,请解释正在发生的事情,我会非常高兴。提前致谢。我只做了简单的网络抓取,所以我不确定如何进行,我还检查了论坛中的其他问题,似乎没有一个与我的问题相似。

import bs4 as bs
import requests
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito') #private
#options.add_argument('--headless') # doesnt open page

browser = webdriver.Chrome('/home/itamar/Desktop/chromedriver', chrome_options=options)

site = 'http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm'

browser.get(site)

到目前为止,这就是我的代码。我无法找到并单击元素按钮“Setor de Atuação”。我已经尝试过 X_path,class,id 但似乎没有任何效果。

【问题讨论】:

    标签: javascript python selenium web-scraping request


    【解决方案1】:

    目标按钮位于 iframe 内,在这种情况下,您必须使用 selenium 驱动程序中的 switch_to 函数,这样会将驱动程序切换到 iframe DOM,然后才能查找按钮。我已经玩过提供的页面并且它有效 - 虽然只使用 Selenium,不需要 Beautiful Soup。这是我的代码:

    from selenium import webdriver
    import time
    
    class B3:
        def __init__(self):
            self.bot = webdriver.Firefox()
    
        def start(self):
            bot = self.bot
            bot.get('http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm')
            time.sleep(2)
    
            iframe = bot.find_element_by_xpath('//iframe[@id="bvmf_iframe"]')
            bot.switch_to.frame(iframe)
            bot.implicitly_wait(30)
    
            tab = bot.find_element_by_xpath('//a[@id="ctl00_contentPlaceHolderConteudo_tabMenuEmpresaListada_tabSetor"]')
            time.sleep(3)
            tab.click()
            time.sleep(2)
    
    if __name__ == "__main__":
        worker = B3()
        worker.start()
    

    希望它适合你!

    参考: https://www.techbeamers.com/switch-between-iframes-selenium-python/

    【讨论】:

    • 完美运行。感谢您的帮助。
    【解决方案2】:

    在这种情况下,我建议您只使用 Selenium,因为它依赖于 Javascripts 处理。

    您可以检查元素并使用 XPath 来选择和选择元素。

    XPath//*[@id="ctl00_contentPlaceHolderConteudo_tabMenuEmpresaListada_tabSetor"]/span/span

    所以你的代码看起来像:

    elementSelect = driver.find_elements_by_xpath('//*[@id="ctl00_contentPlaceHolderConteudo_tabMenuEmpresaListada_tabSetor"]/span/span')
    elementSelect[0].click()
    time.sleep(5)  # Wait the page to load.
    

    PS:我建议您搜索 B3 的 API 服务。我找到了这个link,但我没有阅读它。或许他们已经对这类数据进行了拆分。

    关于 XPath:https://www.guru99.com/xpath-selenium.html

    【讨论】:

    • 好吧,谢谢你的 api 链接。我不知道它的存在哈哈。至于代码,它也没有工作。返回的列表为空。
    【解决方案3】:

    我无法理解这个问题,所以如果你能显示一个代码 sn-p 那就更好了。 我建议你使用BeautifulSoup 进行网页抓取。

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 2020-10-04
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多