Como obter um texto específico que pertence à classe div

Jan 29 2021

<div class="col_5"> 
       <br>
            <i class="phone">
                  :: Before
                  </i>
                  0212 / 897645
            <br>
                  
                  <i class="print">
                  :: Before
                  </i>
                  0212 / 111111
            <br>
       <br>
</div>

Em primeiro lugar, estou pegando dados de um site e aplicando-os ao Excel usando pandas.

Eu tenho um código html conforme declarado acima. Quero pegar o número de telefone que vem depois do <i class='phone'>e passar o outro. No entanto, o número de telefone não pertence à classe I, então eu só poderia obter os números obtendo 'xpath' do, <div class='col_5'>mas isso não é seguro para mim porque alguns 'divs' não têm o número de telefone e têm apenas o número de impressão e isso pode ser mortal para mim. Por exemplo, eu tento encontrar o xpath desse <div class='col_5'>tipo

num = browser.find_element_by_xpath('div[1]/div/div[103]/div[2]')
num.text.split('\n')

e a saída é

['02243 / 80343', '02243 / 83261']

<div class="col_5"> 
       <br>
            <i class="phone">
                  ::Before
                  </i>
                  
               <br>
                  <i class="print">
                  ::Before
                  </i> 
                  0201 / 623424
               <br>
        <br>
        <a href="mailto:[email protected]"> <i class="envelope"> </i> E-Mail</a>
 </div>

Acima eu compartilhei o código que não tem o número do telefone, mas tem apenas o número da impressão. Quando obtenho o xpath <div class='col_5'>no segundo código, obtenho apenas o número de impressão e, enquanto isso acontece, adiciono meu número de impressão de dados como número de telefone. E isso está causando dados incorretos. E quando faço exatamente as mesmas coisas indicadas acima, a saída é

['0201 / 623424', '', 'E-Mail']

Então, quando tento pegar o primeiro item, ele pega o número da impressão. Se houver número de telefone, eu só quero pegar, senão, pegue e siga em frente. Isso é possível?

Respostas

1 DebanjanB Jan 29 2021 at 04:42

Para imprimir o texto, 0212 / 897645você deve induzir WebDriverWait para o visibility_of_element_located()e pode usar uma das seguintes estratégias de localizador :

  • Usando CSS_SELECTOR, childNodes e strip():

    print(driver.execute_script('return arguments[0].childNodes[5].textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.col_5")))).strip())
    
  • Usando XPATH, get_attribute()e splitlines():

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[1]/div/div[103]/div[2]"))).get_attribute("innerHTML").splitlines()[4])
    
  • 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
    

Referências

Você pode encontrar algumas discussões detalhadas relevantes em:

  • Como recuperar texto parcial de um nó de texto usando Selenium e Python
  • Como obter texto de nós de texto separados por espaços em branco usando Selenium e Python