Cómo recuperar el texto de un WebElement usando Selenium - Python

Resuelto Saadiq asked hace 5 años • 1 respuestas

Soy nuevo en Python y Web Scraping, así que tengan paciencia. He estado intentando crear una herramienta de raspado web para abrir una página web, iniciar sesión y recuperar un valor determinado. Hasta ahora, he podido abrir la página web e iniciar sesión. Sin embargo, simplemente no puedo encontrar una manera de recuperar (imprimir) el valor que necesito. Así es como se ve mi código actual:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome(executable_path=r'C:/Users/User/Downloads/chromedriver.exe')

url = "xxxxxxxx"
driver.get(url)
driver.find_element_by_name("username").send_keys("xxxxx")
driver.find_element_by_name("password").send_keys("xxxxx")
elem = driver.find_element_by_css_selector("form#frmMain > a:nth-child(4)")
elem.click()

html = '''<p class="value noWrap" data-bind="text: MarketValue">R 4 516 469.32</p>'''
soup = BeautifulSoup(html, 'lxml')

for p in soup.find_all('p'):
    print(p.string)

driver.quit()

El valor que necesito está incrustado en la variable html encima de "R 4 516 469,32". Sin embargo, este valor cambia diariamente. Intenté usar xpath y css, pero el valor en cuestión parece estar oculto por alguna extraña razón. ¿Cómo puedo hacer referencia al elemento dinámicamente para poder recuperar el nuevo valor todos los días?

Tenga en cuenta: he borrado la URL porque este es un sitio web utilizado para fines empresariales.

¡Por favor ayuda!

Muchas gracias

Saadiq avatar Mar 19 '19 18:03 Saadiq
Aceptado

El elemento deseado es un elemento dinámico, por lo que para extraer el texto dentro del elemento debe inducir WebDriverWaitvisibility_of_element_located() y puede utilizar cualquiera de las siguientes soluciones:

  • Usando CSS_SELECTOR:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "p.value.noWrap[data-bind$='MarketValue']"))).get_attribute("innerHTML"))
    
  • Usando XPATH:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//p[@class='value noWrap' and contains(@data-bind,'MarketValue')]"))).get_attribute("innerHTML"))
    
  • Nota : Debe agregar las siguientes importaciones:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
undetected Selenium avatar Mar 19 '2019 12:03 undetected Selenium