1

Italy publishes its laws on the official "Gazzetta Ufficiale" website.

This is a sample page on which you can see that within a div with id=elenco_hp there is a long list of spans.

I am trying to understand how to iterate through the spans and when I find one like <span class="emettitore">AGENZIA ITALIANA DEL FARMACO</span> then fetch all of the subsequent href strings contained in the following <span class="risultato"> spans (one or several) UNTIL I I read a "rubrica" or "emettitore" span.

I tried the following code but it does not work:

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver.get("https://www.gazzettaufficiale.it/gazzetta/serie_generale/caricaDettaglio?dataPubblicazioneGazzetta=2021-05-19&numeroGazzetta=118")
elems = driver.find_elements_by_class_name("risultato")
links = [elem.get_attribute("href") for elem in elems]
    for link in links:
         print(link)  

but only get around 20 prints of None.

Robert Alexander
  • 875
  • 9
  • 24

1 Answers1

1

To print the value of the href attribute you have to induce WebDriverWait for the visibility_of_all_elements_located() and you can use either of the following Locator Strategies:

  • Using CSS_SELECTOR:

    driver.get("https://www.gazzettaufficiale.it/gazzetta/serie_generale/caricaDettaglio?dataPubblicazioneGazzetta=2021-05-19&numeroGazzetta=118")
    print([my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span.emettitore +span.risultato > a")))])
    
  • Using XPATH:

    driver.get("https://www.gazzettaufficiale.it/gazzetta/serie_generale/caricaDettaglio?dataPubblicazioneGazzetta=2021-05-19&numeroGazzetta=118")
    print([my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//span[@class='emettitore']//following::span[@class='risultato']/a")))])
    
  • Console Output:

    ['https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21G00076&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21G00076&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02967&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02967&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02966&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02966&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02743&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02743&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A03151&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A03151&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02741&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02741&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A03056&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A03056&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02882&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02882&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02744&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02744&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02640&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02640&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02928&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02928&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02948&elenco30giorni=false', 'https://www.gazzettaufficiale.it/atto/serie_generale/caricaDettaglioAtto/originario?atto.dataPubblicazioneGazzetta=2021-05-19&atto.codiceRedazionale=21A02948&elenco30giorni=false']
    
  • Note : You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
  • 1
    thank you so much. I have a lot to study from your deep knowledge since I just started, but it works well. Only additional thing I need to understand is how to select only the spans published under the class="emettitore">AGENZIA ITALIANA DEL FARMACO and ignore the others. – Robert Alexander Dec 28 '21 at 19:37
  • @RobertAlexander Glad to be able to help you. Can you raise a new question with your new requirement please? – undetected Selenium Dec 28 '21 at 19:39
  • Probably my poor English is misleading but in my original question this was asked in the third paragraph :) Thank you very much. – Robert Alexander Dec 28 '21 at 19:44
  • @RobertAlexander Checkout the updated answer and let me know the status. – undetected Selenium Dec 28 '21 at 20:04
  • 1
    I think I'll have to study for a few days. Right now it looks like magic :) The solution is not exactly what I need since your code is selecting the "risultato" spans each time the "emettitore" changes but I need to fetch all of the "risultato" spans under specific "emettitore" (that has "AGENZIA ITALIANA DEL FARMACO" as its value). Still your code is very very valuable to me to understand and study. Thank you from my heart. – Robert Alexander Dec 28 '21 at 20:45