Condividi:        

Importare tabelle da web

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: Importare tabelle da web

Postdi Anthony47 » 28/02/22 16:59

La macro lavora "alla cieca", cioe' da' un comando e assume che il comando sia dato al momento giusto e produca l'esito atteso.
In pratica, del tipo: sali sull'autobus, scendi alla terza fermata, 50 mt avanti gira a destra, etc etc
Se l'autobus quel giorno non fa la prima fermata perche' non c'e' nessuno che deve scendere e nessuno alla fermata tu scenderai sempre alla terza fermata fatta, la quarta in realta', e 50 mt dopo giri a destra e ti spiaccichi contro un muro.
Ecco perche' ha gia' del miracoloso dopo N comandi alla cieca essere alla destinazione voluta.

Inoltre SendKeys invia comandi alla finestra attiva; ergo se modifichi la finestra attiva ti spiaccichi molto prima della terza fermata: non toccare niente fino al completamento della macro.

Poi quando copi il testo di una pagina non copi quello che vedi sullo schermo, ma le informazioni che, opportunamente gestite dal browser e dai tag html generano quel risultato: e' un testo senza capo ne coda, se esaminato separatamente dal codice html di cui faceva parte.
Insomma, senza l'uso di selenium sono difficili da elaborare.

Quanto al True, non so proprio come Firefox possa comunicare che ha completato il comando; penso che sia ininfluente, anche perche' avevo inserito delle wait di 100 msec dopo ogni comando.

Infine, quanto a tornare su Excel a conclusione della macro, aggiungi queste istruzioni subito prima di End Sub:
Codice: Seleziona tutto
On Error Resume Next
AppActivate "Excel"
AppActivate "Microsoft Excel"
On Error GoTo 0
End Sub          'Gia' presente

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Sponsor
 

Re: Importare tabelle da web

Postdi aggittoriu » 28/02/22 18:45

Ah, ok. Se per alla cieca intendevi quello, allora ho capito. Era lo stesso problema con AutoMouseClicker.

Però, se io faccio a mano ctrl+a, poi ctrl+c, poi vado su excel e scelgo incolla speciale-->solo testo, le quote me le mette una in ogni cella. Non tutte in una sola cella.
Comunque, ripeto. Non è un grosso problema. A me basta avere le quote, poi in qualunque modo siano scritte, me le riordino da me.

Il codice per tornare su Excel me l'hai dato.

Forse... e dico forse... su questo non ti scoccio più! :D

Thanks!
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi aggittoriu » 08/04/22 16:00

Ciao Anthony.

Mi vedo costretto a riesumare questa discussione, perchè sono tornato all'utilizzo della macro che mi avevi dato, che prevedeva l'utilizzo di Selenium.

Fino a ieri funzionava bene, anche se per aprire ogni pagina ci metteva un'eternità.
Oggi non funziona più e mi esce questo messaggio. :(
Immagine

Si può risolvere? E come?
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 08/04/22 22:25

Devi sostituire il driver Selenium per Chrome; torna su viewtopic.php?f=26&t=112225 e vedi il punto 2, "Installiamo quindi i driver giusti..."

Poi e' opportuno che blocchi l'aggiornamento automatico di Chrome, lo aggiornerai tu periodicamente provvedendo al contempo all'aggiornamento del driver

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 09/04/22 13:26

Ah, ok. Tutto qui. Io pensavo si dovesse cambiare anche parte del codice. :oops:

E poi c'ero due ore per ritrovare la cartella con tutti i file di Selenium. :mmmh:

Ora va di nuovo. 8)

Grazie! ;)
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi aggittoriu » 13/04/22 17:56

Scusa se disturbo ancora. :oops:

Questo non è importante. Ma mi chiedevo se fosse possibile importare il testo con il suo collegamento ipertestuale. Perchè poi da quello, mi devo estrarre gli url delle partite in programma. Come se facessi copia e incolla, insomma.

Vorrei farlo tramite vba, perchè sono solo due pagine, ma spesso la prima non si apre mai. Metto l'url giusto, do invio, l'url cambia e si apre la home (che a me non interessa). E devo stare lì a provare e riprovare in continuazione. :mmmh:

A proposito di questo poi, metto un file perchè, proprio per verificare che la pagina sia corretta, in C1 metto una formula che mi dovrebbe trovare l'ultima riga. Se ci sono poche righe, vuol dire che la pagina non è quella giusta, quindi me la deve importare dinuovo. Ma mi da errore e la macro si blocca. Se poi ci clicco sopra due volte e do invio, la formula funziona. Perchè?

Il file
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 13/04/22 23:56

Intanto chiedo anche a te una cortesia: se usate le macro che pubblico io non cambiategli il nome, altrimenti perdo tempo a capire quale era il mio ambiente di prova, e il tempo e' tra le risorse piu' rare.

Se vuoi importare anche gli hyperlink bisogna cambiare l'approccio della GetImpQ, che oggi lavora sfruttando il metodo "AsTable"; bisogna invece lavorare a livello di righe e colonne, potendo così esaminare gli eventuali hyperlink. Ovviamente lavorando cella a cella i tempi di esecuzione della macro peggioreranno...
Visto inoltre che spesso invocando una pagina il sito ne restituisce un'altra ho messo un controllo con ricarico dell'url fino a 2 volte in caso di difformita'
Il codice della nuova routine:
Codice: Seleziona tutto
Sub GetAllTableTd(myUrl As String, Optional rNum0 As Long = 1, Optional cNum0 As Long = 1)
Dim TBColl As Object
Dim I As Long, J As Long, myTim As Single
Dim RNum As Long, CNum As Long
   
Dim TArr

Dim TDColl As Object, TRColl As Object, AColl As Object, PiPPo As Long

If WPage Is Nothing Then
     Set WPage = CreateObject("Selenium.CHRomedriver")
End If

'''On Error Resume Next
reUrl:
WPage.Get myUrl
'
If myUrl <> WPage.Url And PiPPo < 3 Then
    PiPPo = PiPPo + 1
    GoTo reUrl
End If

myTim = Timer
'
Set TBColl = WPage.FindElementsByTag("table")
RNum = rNum0: CNum = cNum0
'
For I = 1 To TBColl.Count               'Scan delle Tabelle presenti
    RNum = RNum + 1
    Cells(RNum, CNum).Value = "## Table " & I
    Debug.Print "## Table " & I, Format(Timer - myTim, "0.0"), RNum
    Set TRColl = TBColl(I).FindElementsByTag("tr")
    RNum = RNum + 1: CNum = cNum0
    For J = 1 To TRColl.Count
        Set TDColl = TRColl(J).FindElementsByTag("td")
        For k = 1 To TDColl.Count
            Cells(RNum, CNum).Value = TDColl(k).Text
            Set AColl = TDColl(k).FindElementsByTag("a")
            If AColl.Count > 0 Then
                ActiveSheet.Hyperlinks.Add anchor:=Cells(RNum, CNum), _
                       Address:=AColl(1).Attribute("href")
            End If
            CNum = CNum + 1
        Next k
        RNum = RNum + 1: CNum = cNum0
'        Debug.Print "## Table " & I, Format(Timer - myTim, "0.0"), RNum
    Next J
    RNum = RNum + 1
    DoEvents
Next I
Debug.Print "FINE", RNum, Format(Timer - myTim, "0.00"), myUrl

End Sub

Ovviamente nella tua Sub ImpQ chiamerai questa nuova routine invece che la vecchia

Quanto alla formula che tramite Sub ImpQ metti in C1, visto che ci metti un CONFRONTA essa spesso ti restituisce #ND, mandando in tilt il check che fai sul risultato che ti aspetti numerico.
Metti un CONTA.VALORI e dovresti trovarti bene:
Codice: Seleziona tutto
    Range("C1").Formula = "=COUNTA(D:D)"


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 14/04/22 07:52

Ok. Me la guardo stasera o stanotte, poi ti faccio sapere. ;)

Per il nome della macro, sono costretto a cambiarlo. Se gli lascio GetAllTableTd, come faccio a ricordarmi cosa deve fare? Non uso solo una macro. Ne uso diverse. E se non do un nome che mi faccia capire immediatamente cosa deve fare, poi non ci capisco più niente. :oops:
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 14/04/22 11:01

Io di macro ne maneggio probabilmente piu' di te e infatti cerco di dare nomi mnemonici:
GetAllTableTd preleva tutte le tabelle usando i suoi TD; GetAllTablesArr preleva tutte la tabelle come array.
Che tu le usi per leggere dal sito A o dal sito B la funzione e' sempre la stessa.

Puoi mettere tutte le informazioni come commenti prima o dopo l'inizio della macro:
Codice: Seleziona tutto
Sub GetAllTableTd(myUrl As String, Optional rNum0 As Long = 1, Optional cNum0 As Long = 1)
'serve per fare questo e quello
'vedi http://www.pc-facile.com/forum/posting.php?f=26&t=111428
Dim TBColl As Object
'. . .

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 14/04/22 16:43

Allora... ho provato il nuovo codice. E si, funziona. Solo che quando dici
Anthony47 ha scritto:Ovviamente lavorando cella a cella i tempi di esecuzione della macro peggioreranno...
, quel "peggiorano" per me vogliono dire 13 minuti e 25 secondi. :mmmh:

Una curiosità. il tuo pc quanto ci impiega?

Il bello però è che dopo che la lancio, posso usare il pc per altro. Quindi se non ho proprio fretta, quei tredici minuti e passa, non dovrebbero pesarmi più di tanto. Quindi può già andar bene così. ;) Anche perchè magari mi servirà per altro più in là.

Thanks!

P.s. Per il nome invece, se il tuo lo metto subito dopo il nome dato da me, sotto forma di commento, va bene lo stesso? Non voglio annoiarti sul come ragiono io. Ma io devo dare il nome in base a ciò che mi serve fare. Altrimenti non ne esco più.
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi Anthony47 » 14/04/22 22:47

La versione iniziale a me dura circa 4 minuti; quella che cerca anche gli hyperlink circa 8'20"

Ho voluto provare un ibrido, che un po' lavora con selenium e un po' con la libreria per I.E.

Il risultato e' questa "penultima" versione:
Codice: Seleziona tutto
Sub GetAllTablesLE(myUrl As String, Optional rNum0 As Long = 1, Optional cNum0 As Long = 1)
Dim TBColl As Object, StrHtm As String
Dim I As Long, J As Long, myTim As Single
Dim RNum As Long, CNum As Long, HTDoc As Object
Dim iniTab As Long, finiTab As Long
'Dim TArr
Dim TDColl As Object, TRColl As Object, AColl As Object, PiPPo As Long

If WPage Is Nothing Then
     Set WPage = CreateObject("Selenium.CHRomedriver")
End If
'''On Error Resume Next
reUrl:
WPage.Get myUrl
'
'Carica e ricarica...
If myUrl <> WPage.Url And PiPPo < 4 Then
    PiPPo = PiPPo + 1
    Debug.Print "Non pronta", PiPPo, myUrl, WPage.Url
    GoTo reUrl
End If
Debug.Print "Pagina pronta", PiPPo, myUrl, WPage.Url
myTim = Timer
'
Set HTDoc = CreateObject("HTMLfile") 'late binding alla html obj lib
'
'Crea htmlDocument:
HTDoc.Open
lenhtml = Len(WPage.PageSource)
Do
    iniTab = InStr(finiTab + 1, WPage.PageSource, "<table", vbTextCompare)
    finiTab = InStr(iniTab + 1, WPage.PageSource, "</table", vbTextCompare)
    If iniTab = 0 Then Exit Do
    StrHtm = StrHtm & Mid(WPage.PageSource, iniTab, finiTab - iniTab + 10)
Loop
HTDoc.write StrHtm
'
'esamina i tag tabella/riga/dati:
If Not HTDoc Is Nothing Then
    Set TBColl = HTDoc.getElementsByTagName("table")
    RNum = rNum0: CNum = cNum0
    For I = 0 To TBColl.Length - 1
        RNum = RNum + 1
        Cells(RNum, CNum).Value = "## Table " & I
        Debug.Print "## Table " & I, Format(Timer - myTim, "0.0"), RNum
        Set TRColl = TBColl(I).getElementsByTagName("tr")
        RNum = RNum + 1: CNum = cNum0
        For J = 0 To TRColl.Length - 1
            Set TDColl = TRColl(J).getElementsByTagName("td")
            For k = 0 To TDColl.Length - 1
                Cells(RNum, CNum).Value = TDColl(k).innerText
                Set AColl = TDColl(k).getElementsByTagName("a")
                If AColl.Length > 0 Then
                    ActiveSheet.Hyperlinks.Add anchor:=Cells(RNum, CNum), _
                           Address:=AColl(0).href
                End If
                CNum = CNum + 1
            Next k
            RNum = RNum + 1: CNum = cNum0
    '        Debug.Print "## Table " & I, Format(Timer - myTim, "0.0"), RNum
        Next J
        RNum = RNum + 1
        DoEvents
    Next I
End If
Debug.Print "FINE-XA", RNum, Format(Timer - myTim, "0.00"), myUrl
End Sub


La versione "LimitedEdition" sostituisce la precedente Sub GetAllTableTd (o come l'avrai voluta chiamare) e impiega "qualcosa" in meno
Ovviamente dovrai modificare le due Call all'interno della Sub ImpQ

Prova anche tu...
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare tabelle da web

Postdi aggittoriu » 15/04/22 07:38

Ah... ok. 8'20" vuol dire che non è solo colpa del mio pc. Mi interessava sapere quello.

Per il nuovo codice, dinuovo, me lo guardo stasera o stanotte. Poi torno. :D

A dopo! ;)
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi aggittoriu » 15/04/22 23:05

Ciao Anthony47.

Scusa. Avevo detto che l'avrei guardato stanotte, ma non ce la faccio. Sto scaricando i dati di 117 partite e ci impiegherò più di un'ora e venti a finire. Quindi lo guarderò domani sera/notte.

Volevo chiederti però una cosa. Giusto per fugare ogni mio dubbio. Conosci un modo per importare anche le quote passate? Quelle che si vedono andandoci sopra col mouse e che spariscono subito appena ti sposti da quella quota. Ma non da BmBets, perchè sono sbagliate. Da BetExplorer. Ti metto il link di una partita a caso:

https://www.betexplorer.com/soccer/chile/primera-division/u-de-chile-palestino/UqlNje14/

Potrebbe essere interessante. :roll:
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Re: Importare tabelle da web

Postdi aggittoriu » 16/04/22 14:11

Caspita! "Qualcosa in meno". :eeh: L'ho provata e siamo passati da 13' 25" a 2' 43". :)

Questa è perfetta! ;)

Mentre ieri notte mi ha dato qualche problema la GetAllTableTd (la mia ImpQ), perchè ha saltato le quote di qualche partita e in generale mi salta la prima partita che importo. E mi sono incasinato un po', nel tentativo di recuperarle. :mmmh:
aggittoriu
Utente Senior
 
Post: 161
Iscritto il: 24/06/14 08:49

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "Importare tabelle da web":


Chi c’è in linea

Visitano il forum: Nessuno e 44 ospiti