Python - Selenium - não é possível criar conteúdo de texto específico para webcrape de html

Aug 27 2020

Eu tento fazer o webcrape desta parte de um 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

deste site:

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

com 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)

Eu tentei por 4 horas e não consegui. Eu tentei com métodos diferentes como xpath, texto do link etc., mas tudo que consegui é um nome de empresa vazio como este "[]".

Alguém sabe como o selênio pode encontrar esse texto exato "Liebherr-Hausgeräte Ochsenhausen GmbH"?

Muito obrigado.

Respostas

DebanjanB Aug 27 2020 at 19:06

Para imprimir o texto Schneider Electric Holding Germany GmbH, você deve induzir WebDriverWait para o visibility_of_element_located()e pode usar uma das seguintes estratégias de localizador :

  • Usando CSS_SELECTORe texto 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 XPATHe 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"))
    
  • Saída do console:

    Schneider Electric Holding Germany GmbH
    
  • Nota : Você deve adicionar as seguintes importações:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Você pode encontrar uma discussão relevante em Como recuperar o texto de um WebElement usando Selenium - Python


Outro

Link para documentação útil:

  • get_attribute() método Gets the given attribute or property of the element.
  • text retorna atributo The text of the element.
  • Diferença entre texto e HTML interno usando Selenium
balderman Aug 27 2020 at 18:53

O que você está procurando pode ser encontrado no código-fonte da página em

<div data-company-search><div data-var-name="companyResults" datae faz parte da fonte da página. Portanto, você não precisa de selênio para obtê-lo. é só ler a página de pedidos e encontrar os dados usando a Beautiful Soup.