Python - Selenium - no se puede copiar contenido de texto específico de HTML desde HTML

Aug 27 2020

trato de webscrape esta parte de un html:

<td class="zebraTable__td zebraTable__td--companyName"><a href="/unternehmen/8116602/schneider-electric-holding-germany-gmbh" data-gtm="companySearch__searchResult--76">
                        Schneider Electric Holding Germany GmbH
                    </a></td>

código HTML

de este sitio:

https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=0&employeesTo=100000000&sortMethod=revenueDesc&p=4

con este Código:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import pandas as pd
import time 

driver = webdriver.Chrome('/Users/rieder/Anaconda3/chromedriver_win32/chromedriver.exe')

driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1')

driver.find_element_by_id("cookiesNotificationConfirm").click();

company_name = driver.find_element_by_class_name('zebraTable__td zebraTable__td--companyName')

print(company_name)

Lo probé durante 4 horas y no puedo conseguirlo. Lo intenté con diferentes métodos como xpath, texto de enlace, etc. pero todo lo que obtuve es un nombre de empresa vacío como este "[]".

¿Alguien sabe cómo el selenio puede encontrar este texto exacto "Liebherr-Hausgeräte Ochsenhausen GmbH"?

Muchas gracias.

Respuestas

DebanjanB Aug 27 2020 at 19:06

Para imprimir el texto Schneider Electric Holding GmbH Alemania tiene que inducir WebDriverWait para el visibility_of_element_located()y se puede utilizar cualquiera de las siguientes estrategias de localización :

  • El uso CSS_SELECTORy el texto del atributo:

    driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=0&employeesTo=100000000&sortMethod=revenueDesc&p=4')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#cookiesNotificationConfirm"))).click()
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table.zebraTable.zebraTable--companies tr:nth-child(2)>td.zebraTable__td.zebraTable__td--companyName>a"))).text)
    
  • Usando XPATHy get_attribute("innerHTML"):

    driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=0&employeesTo=100000000&sortMethod=revenueDesc&p=4')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@id='cookiesNotificationConfirm']"))).click()
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='zebraTable zebraTable--companies']//following::tr[2]/td[@class='zebraTable__td zebraTable__td--companyName']/a"))).get_attribute("innerHTML"))
    
  • Salida de consola:

    Schneider Electric Holding Germany GmbH
    
  • 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
    

Puede encontrar una discusión relevante en Cómo recuperar el texto de un WebElement usando Selenium - Python


Outro

Enlace a documentación útil:

  • get_attribute() método Gets the given attribute or property of the element.
  • text devoluciones de atributos The text of the element.
  • Diferencia entre texto e innerHTML usando Selenium
balderman Aug 27 2020 at 18:53

Lo que busca se puede encontrar en el código fuente de la página bajo

<div data-company-search><div data-var-name="companyResults" datay es parte de la fuente de la página. Por lo tanto, no necesita selenio para obtenerlo. simplemente lea la página con las solicitudes y encuentre los datos usando Beautiful Soup.