Cómo recuperar el texto de un WebElement usando Selenium - Python
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
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