【问题标题】:Getting value after button click with BeautifulSoup Python使用 BeautifulSoup Python 单击按钮后获取价值
【发布时间】:2019-05-27 03:47:45
【问题描述】:

我试图在单击按钮后获取网站给出的值。

这里是网站:https://www.4devs.com.br/gerador_de_cpf

可以看到有一个按钮叫做“Gerar CPF”,这个按钮提供了一个点击后出现的数字。

我当前的脚本打开浏览器并获取值,但是我在点击之前从页面获取值,所以该值为空。我想知道点击按钮后是否可以获取值。

from selenium import webdriver
from bs4 import BeautifulSoup
from requests import get

url = "https://www.4devs.com.br/gerador_de_cpf"

def open_browser():
    driver = webdriver.Chrome("/home/felipe/Downloads/chromedriver")
    driver.get(url)
    driver.find_element_by_id('bt_gerar_cpf').click()

def get_cpf():
    response = get(url)

    page_with_cpf = BeautifulSoup(response.text, 'html.parser')

    cpf = page_with_cpf.find("div", {"id": "texto_cpf"}).text

    print("The value is: " + cpf)


open_browser()
get_cpf()

【问题讨论】:

    标签: python selenium web-scraping beautifulsoup web-crawler


    【解决方案1】:

    open_browserget_cpf 绝对没有关系...

    实际上你根本不需要get_cpf。点击按钮后等待文本:

    from selenium.webdriver.support.ui import WebDriverWait as wait
    
    def open_browser():
        driver = webdriver.Chrome("/home/felipe/Downloads/chromedriver")
        driver.get(url)
        driver.find_element_by_id('bt_gerar_cpf').click()
        text_field = driver.find_element_by_id('texto_cpf')
        text = wait(driver, 10).until(lambda driver: not text_field.text == 'Gerando...' and text_field.text)
        return text
    
    print(open_browser())
    

    更新

    请求也一样:

    import requests
    
    url = 'https://www.4devs.com.br/ferramentas_online.php'
    data = {'acao': 'gerar_cpf', 'pontuacao': 'S'}
    response = requests.post(url, data=data)
    print(response.text)
    

    【讨论】:

    • 你是对的,它们没有关系。但我在这里尝试了你的代码,但仍然是空值
    • @Felipe ,您是尝试初始答案还是最后更新?还是没有输出?我尝试了几次并获得了所需的输出......
    • 我尝试了最后一次更新,这里是输出:
      跨度>
    • @Felipe ,嗯...我的代码绝对不能返回div node...我认为您使用不正确。只需print(open_browser()) 即可获得价值
    • @Felipe ,我不使用 Scrapy,所以无法为您提供合适的代码。检查更新的答案
    【解决方案2】:

    您不需要使用 requests 和 BeautifulSoup。

    from selenium import webdriver
    from time import sleep
    
    url = "https://www.4devs.com.br/gerador_de_cpf"
    
    def get_cpf():
        driver = webdriver.Chrome("/home/felipe/Downloads/chromedriver")
        driver.get(url)
        driver.find_element_by_id('bt_gerar_cpf').click()
        sleep(10)
        text=driver.find_element_by_id('texto_cpf').text
        print(text)
    get_cpf()
    

    【讨论】:

      【解决方案3】:

      你能在文本改变之前使用 While 循环吗?

      from selenium import webdriver
      
      url = "https://www.4devs.com.br/gerador_de_cpf"
      
      def get_value():
          driver = webdriver.Chrome()
          driver.get(url)
          driver.find_element_by_id('bt_gerar_cpf').click()
          while driver.find_element_by_id('texto_cpf').text == 'Gerando...':
              continue
          val = driver.find_element_by_id('texto_cpf').text
          driver.quit()
          return val
      
      print(get_value())
      

      【讨论】:

        【解决方案4】:

        我推荐这个做同样事情的网站。

        https://4devs.net.br/gerador-cpf

        但是要使用 selenium 获得“gerar cpf”操作,您可以使用浏览器检查 HTML 源代码,然后单击“复制此元素的 XPath”。

        这比手动搜索页面中的元素要简单得多。

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2021-12-10
        • 2021-10-18
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        相关资源
        最近更新 更多