Come ottenere un testo specifico che appartiene alla 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>

In primo luogo sto ottenendo dati da un sito Web e applicando questi dati per eccellere utilizzando i panda.

Ho un codice html come indicato sopra. Voglio prendere il numero di telefono che viene dopo <i class='phone'>e passare l'altro. Tuttavia il numero di telefono non appartiene alla classe I quindi potrei ottenere i numeri solo ottenendo 'xpath' di <div class='col_5'>ma questo non è sicuro per me perché alcuni 'div' non hanno il numero di telefono e hanno solo il numero di stampa e questo potrebbe essere mortale per me. Ad esempio, provo a trovare l'xpath di <div class='col_5'>così

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

e l'output è

['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>

Sopra ho condiviso il codice che non ha il numero di telefono ma ha solo il numero di stampa. Quando ottengo l'xpath di <div class='col_5'>nel secondo codice ottengo solo il numero di stampa e mentre ciò accade aggiungo il mio numero di stampa dei dati come numero di telefono. E questo sta causando dati errati. E quando faccio le stesse cose esatte come indicato sopra, l'output è

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

Quindi, quando provo a prendere il primo oggetto, prende il numero di stampa. Se c'è il numero di telefono, voglio solo prenderlo, in caso contrario, prenderlo e andare avanti. È possibile?

Risposte

1 DebanjanB Jan 29 2021 at 04:42

Per stampare il testo 0212 / 897645devi indurre WebDriverWait per il visibility_of_element_located()e puoi utilizzare una delle seguenti strategie di localizzazione :

  • Utilizzando 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())
    
  • Utilizzando 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 : devi aggiungere le seguenti importazioni:

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

Riferimenti

Puoi trovare un paio di discussioni dettagliate pertinenti in:

  • Come recuperare il testo parziale da un nodo di testo usando Selenium e Python
  • Come ottenere testo da textnodes separati da spazi bianchi usando Selenium e Python