Accodamento da web in base a un progressivo L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Rispondi

fabrixyzt
Messaggi: 4 | Topic creati
Iscritto il: lun 13 gen 2025, 17:30

Accodamento da web in base a un progressivo

Messaggio da fabrixyzt »

Buonasera a tutti!

Ho una difficoltà in Power Query che non riesco a risolvere e chiederei cortesemente un aiuto.

In un sito sono presenti tabelle referenziate da un link la cui ultima parte è un progressivo:

https://nomesito-2020
https://nomesito-2021
https://nomesito-2022
ecc.

Memorizzando ogni estrazione da web in query dal nome Estrazione2020, Estrazione2021 ecc., grazie a un suggerimento di questo forum, le ho accodate tutte con un'unica query:

Codice: Seleziona tutto

Table.Combine(Table.SelectRows( Record.ToTable(#shared), each Text.StartsWith([Name], "Estraz"))[Value])
Il passo successivo sarebbe però quello di eliminare le singole query EstrazioneXXXX impostando un classico ciclo per Num che va da N a M nell'istruzione generalizzata:

Codice: Seleziona tutto

"https://nomesito-" & Number.ToText(Num)
Non riesco però né a generalizzare la precedente (perché presuppone appunto la presenza di oggetti con un nome parziale comune che non voglio più dover estrarre manualmente), né il codice decisamente base riportato sotto, ottenuto per copia incolla N volte cambiando l'anno.

Allego anche un file con entrambi gli esempi non abbreviati.

Grazie in anticipo per eventuali risposte e buona serata!

Codice "essenziale":

Codice: Seleziona tutto

let
    Origine = Table.Combine({
    let
	Origine = Web.BrowserContents("https://nomesito-2020/"),
	#"Tabella estratta da HTML" = Html.Table(Origine, {elenco colonne...}, [RowSelector="..."])
    in
	#"Tabella estratta da HTML",
    let
	Origine = Web.BrowserContents("https://nomesito-2021/"),
	#"Tabella estratta da HTML" = Html.Table(Origine, {elenco colonne...}, [RowSelector="..."])
    in
	#"Tabella estratta da HTML",

    ecc. ecc. ...

    })
in
Origine
Allegati
AccodamentoDomanda.xlsx
(16.73 KiB) Scaricato 1 volta


Avatar utente

Andrea90
Messaggi: 2673 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 728 volte
Contatta:

Accodamento da web in base a un progressivo

Messaggio da Andrea90 »

@fabrixyzt

Perché non usare la notazione {2021..2023} per creare una lista di valori dal 2021 al 2023… poi espandere questa lista in riga così da avere ognuno di quei numeri disposti su righe distinte e poi creare dinamicamente il link al sito accodando alla parte iniziale statica il numero appena calcolato?

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
fabrixyzt
Messaggi: 4 | Topic creati
Iscritto il: lun 13 gen 2025, 17:30

Accodamento da web in base a un progressivo

Messaggio da fabrixyzt »

Buonasera Andrea e grazie intanto del suggerimento, purtroppo posso rispondere solo tardi.
Forse tendo ancora a pensare come in VB e probabilmente mi fuorvia.
Senz'altro posso concatenarli al resto del link del sito creando una lista col percorso completo anziché avere il singolo numero Num che rappresenta l'anno, il che rende certamente il codice più chiaro, ma purtroppo questo non cambia il problema, lo trasla soltanto.

Un elenco di valori 2021, 2022, 2023 l'avevo infatti creato con una List.Generate, anche se non l'ho riportato nel file, con un'istruzione del tipo:

let
Origine = List.Generate(
() => [x = 2021],
each [x] <= 2023,
each [x = [x] + 1],
each [x]
)
in
Origine

ma non mi ha portato da nessuna parte.
L'avevo convertito in una tabella SeqAnni con campo Anno (passaggio non necessario o che complica il problema?). Dopodiché il Num che citavo nel primo messaggio è il progressivo che potrei richiamare nella Table.Combine dove si trova l'istruzione:

Web.BrowserContents("https://nomesito-" & Number.ToText(SeqAnni[Anno]{elementi da scorrere dall'inizio alla fine, quindi 0, 1,...})).

Singolarmente funzionano, ma siccome non riuscivo ad andare avanti ho riformulato il problema in generale come nel messaggio iniziale.

Mi rendo conto che la mia sia una domanda molto base, ma quello che non riesco a fare è quindi proprio far scorrere i valori delle singole righe nell'istruzione Table.Combine.
So bene che devo mettere un each che le scorre e che non dovrebbe essere nulla di trascendentale, però non riesco a usare la sintassi giusta, perché evidentemente ancora non mi è chiara e ottengo costantemente errore. Probabilmente quando vedrò la soluzione mi darò del rimbambito, ma per ora sono al "Houston, abbiamo un problema"...
Grazie in ogni caso, però, ogni suggerimento è sempre il benvenuto!
Avatar utente

Andrea90
Messaggi: 2673 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 728 volte
Contatta:

Accodamento da web in base a un progressivo

Messaggio da Andrea90 »

@fabrixyzt

Per me la stai facendo più complicata di quello che è …. devi pescare dei dati presenti in url che mantengono la stessa sintassi se non per l’ultima parte.

Non dovrebbe dunque essere difficile avere una colonna con in riga ogni singolo url creato in maniera dinamica.

La funzione da utilizzare è sempre Web.BrowserContents() quindi se aggiungi una colonna con quella formula avrai in ciascuna cella un oggetto tabella che contiene i dati presi dal link indicato.

A questo punto non devi far altro che espandere le righe di ciascuna tabella cliccando sul pulsante col simbolo delle doppie frecce che troverai nell’intestazione della colonna appena creata.

Detto questo, la lettura dei dati web tramite power query è a mio avviso da sconsigliare, troppo lenta... meglio utilizzare altri strumenti, anche se più 'complessi' come ad esempio Python.
fabrixyzt ha scritto: mar 4 feb 2025, 19:52List.Generate
List.Generate() è meglio non utilizzarlo per questo genere di cose (e in generale è da lasciare come ultima spiaggia...), per un elenco di valori basta scrivere {2020..2024} per avere una lista da espandere che contenga i valori {2020, 2021, 2022, 2023, 2024}

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
fabrixyzt
Messaggi: 4 | Topic creati
Iscritto il: lun 13 gen 2025, 17:30

Accodamento da web in base a un progressivo

Messaggio da fabrixyzt »

Salve Andrea,
sono arrivato infine alla soluzione seguendo i suggerimenti. In realtà mi permetto di segnalare un piccolo errore, perché non è la funzione Web.BrowserContents() a generare la tabella (questa riporta solo il codice html), ma l'istruzione successiva Html.Table(Origine, {elenco colonne...}, [RowSelector="..."]), con Origine = Web.BrowserContents("sito"). Mi ci è voluto un po' a capirlo, ma inserita quella è andato tutto a posto.
Molto utile sapere invece che List.Generate è meglio evitarla e non c'è dubbio che generare una lista sequenziale con {2021..2023} sia ben più semplice.
È anche identica a List.Numbers(2021, 3) o l'altra è sempre preferibile?
Idem per Python, ma per ora, almeno per me, è un traguardo molto lontano.
Molto contento quindi di questo primo piccolo risultato!
Allego il file con la soluzione dovesse mai servire a qualche altro viandante di Power Query.
Alla prossima e grazie mille!
Allegati
SoluzioneWEB.xlsx
(14.84 KiB) Scaricato 2 volte
Rispondi