Condividi:        

Importare sorgente pagina web e salvare risultati in txt

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

Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 19/01/13 11:21

Ciao... ho bisogno di un aiuto.
devo scrivere una macro per importare la sorgente di un pagina web (uso Firefox come browser e excel 2010) in un foglio excel, per la precisione nella colonna A del Foglio 1 (ogni riga del codice html deve essere copiato in una riga excel).
Importato il codice ho già impostato delle formule che estraggono le informazioni che mi servono. Tali informazioni ripulite vengono copiate nella colonna G, a me serve esportarle in un foglio di testo txt. Tutto questo si drovrebbe ripetere ogni 10 minuti in automatico.
Per essere più chiaro faccio un esempio:

1 - ho copiato le prime 4 righe della sorgente della pagina iniziale di google nelle celle A1,A2,A3 e A4:

<!doctype html><html itemscope="itemscope" itemtype="http://schema.org....
window.google={kEI:"9W_6UIW4NsPK0AWn8IHoCQ",getEI:function(a){for(var b;a&&(!a.g....
b,c,i){var d=new Image,f=google.lc,e=google.li,g="";d.onerror=d.onload......
pm:"p",pl:[],mc:0,sc:0.5,u:"c9c918f0"},Toolbelt:{},y:{},x:function(a,...

2 - con le formule scritte da me vengono estratte solo alcune righe e copiate nelle colonna G (per esempio solo le prime due del codice html precedente)

3 - cancellare il contenuto della colonna A (il codice html importato)

4 - aprire il file txt dove esportare i risultati e cancellare tutto il contenuto presente (questo per evitare di avere i risultati del ciclo precedente)

5 - esportare tutto il contenuto di G in un file txt (il file dove esportare i dati è sempre lo stesso)

Tutto questo si drovrebbe ripetere ogni 10 minuti in automatico.

Grazie
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Sponsor
 

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 19/01/13 12:56

Tieni presente che il codice html non ha nessun vincolo di riga (guarda ad es il sorgente di www.google.it), per cui mettere 1 riga html in 1 riga (1 cella?) di excel non ha significato.
Per un contributo sensato vorrei avere un url di esemio a cui far riferimento e che cosa, di quella pagina, vorresti prelevare.

Se invece preferisci suggerimenti spiccioli allora devi limitare la domanda ad argomenti specifici.

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 19/01/13 13:47

Grazie per la celere risposta. Tutto quello che ho scritto lo faccio già manualmente. Io uso firefox come browser, e se su qualsiasi pagina web premo destro mouse, visualizza sorgente pagina, visualizzo il codice html con i numeri di riga. Se seleziono tutto, copio e incollo in excel, ogni riga viene copiata in celle diverse.
Su mio foglio excel nelle celle della colonna A viene importato il codice html, nele celle della colonna B ho già scritto le formule necessarie per estrarre quelle che mi interessano. Nelle Colonne C,D,E,F ci sono altre formule necessarie per modificare le righe estratte, nella colonna G ho quello che devo estrarre nel file txt. Faccio un esempio

*********A*************************B (copiare le frasi con porola bella) ****C**D**E**F***********G
é una bella giornata**********é una bella giornata********************************************giornata bella
hai una bella casa************hai una bella casa********************************************** casa bella
hai la moto?*******************

Ho fatto un esempio molto semplice. Grazie
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 19/01/13 15:52

Non volevo mettere in dubbio la validita' del metodo che usi oggi, ma mettere in evidenza che ci sono sistemi piu' automatici per ottenere tramite vba il "text" e l' "html" di pagine web, ad esempio sfruttando gli strumenti di programmazione messi a disposizione dalla libreria mshtml.tlb, corrispondente nel vba al riferimento alla Microsoft Html Object Library.
In queste discussioni trovi qualche esempio di utilizzo, credo che anche nel tuo caso sia piu' facile ed efficace lavorare con lo stesso approccio:
viewtopic.php?f=26&t=97268#p558449
viewtopic.php?f=26&t=95343&start=20#p561186
viewtopic.php?f=26&t=97910
viewtopic.php?f=26&t=98113#p563731

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 19/01/13 17:23

Grazie per l'aiuto Anthony47 è stato molto gentile.
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 19/01/13 21:57

Se vuoi approfondire il tuo caso allora indica un url di esempio, altrimenti ...alla prossima.
Avatar utente
Anthony47
Moderatore
 
Post: 19213
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 30/01/13 17:14

Salve Anthony47, la volevo ringraziare per i suggerimenti che mi ha dato. Sono riuscito a scrivere il codice di cui avevo bisogno. Ho solo un piccolo problema. Nella mia macro devo caricare una macro creata con Macro Scheduler e per fare questo ho usato il comando

Shell ("C:\......\miofile.exe").

Per chiudere tutte le pagine di internet Explorer aperte ho trovato su internet il seguente codice:

Dim Shell As Object
Dim IE As Object
...
Set Shell = CreateObject("Shell.Application")
For Each IE In Shell.Windows
IE.Quit
Next
...

Se uso singolarmente i comandi tutto bene, se li inserisco insieme nel codice ho l'errore: "Proprietà o metodo non supportato dall'oggetto"

Grazie
32
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 30/01/13 20:57

Non so valutare il codice esposto, comunque io "ucciderei" eventuali processi InternetExplorer in modo molto piu' diretto, cioe':
Codice: Seleziona tutto
myPid = Shell("CMD /C TASKKILL /IM  iexplore.exe /F")

Ricorda che "taskkill" non ha completato il suo effetto quando l' istruzione viene data per completata; potresti cioe' avere problemi se subito dopo taskkill parti a creare nuovi oggetti InternetExplorer (probabilmente verrebbero killati anche questi); se pensi che questo sia un pericolo reale aggiungi una attesa di un paio di secondi dopo la riga con "taskkill"; qualcosa come
Codice: Seleziona tutto
myStart = Timer
Do
    DoEvents :If Timer > myStart + 2 Or Timer < myStart Then Exit Do
Loop


In realta' sarebbe molto piu' corretto che la macro che crea un processo lo termini quando la macro ha compltato il suo lavoro; se, come immagino, stai usando all' inizio delle tue macro qualcosa come
Set IE = CreateObject("InternetExplorer.Application")
allora dovresti inserire in coda
IE.Quit
Set IE = Nothing

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 30/01/13 23:06

Grazie per la risposta. Ho risolto usando questo codice:

Dim sKillWord As String
sKillWord = "TASKKILL /F /IM IEXPLORE.exe"
Shell sKillWord, vbHide

che praticamente è lo stesso di quello che suggerisci tu.
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 30/01/13 23:42

Ho risolto usando questo codice
[. . . . ]
che praticamente è lo stesso di quello che suggerisci tu.
Si, solo un po' piu' contorto...
Avatar utente
Anthony47
Moderatore
 
Post: 19213
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 01/02/13 20:18

Una piccola domanda: è possibile usare un browser diverso da Internet Explorer come ad esempio Chrome, Mozilla, Opera o Safari.

Grazie
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 02/02/13 02:06

Io continuo a immaginare che usi Set IE = CreateObject("InternetExplorer.Application"), anche se non l' hai mai detto; questo corrisponde all' uso della libreria vba mshtml.tlb (Microsoft Html Object library), che e' uno strumento Microsoft per l' utilizzo di tecnologia Microsoft sui prodotti Microsoft.
Se Chrome, Mozilla, Opera o Safari hanno un analogo corredo di strumenti allora si potranno integrare analogamente a quanto possibile con InternetExplorer.

Esistono anche altre tecniche di estrazione dati, ma se non puoi spiegare i dettagli del tuo lavoro non so cosa suggerire piu' precisamente.

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 02/02/13 16:56

Ciao Anthony47 grazie per la tua disponiltà.
Il mio lavoro consiste in questo: devo prelevare dei dati da un sito internet, questi dati vengono elaborati direttamente in VBA una prima volta ed esportati su un foglio excel. A questo punto viene avviata una macro esterna che copia e incolla i datti su un secondo software per una seconda elaborazione.
Il problema è che il sito prevede un login e avendo diversi account devo loggarmi e sloggarmi ad ogni ciclo (il ciclo è: prelevare dati dal sito, prima elaborazione in VBA e esportazione dei dati in excel, avvio macro esterna per caricare i dati sul secondo software per la seconda elaborazione).
Sono riuscito a fare tutto questo, quindi ad ogni ciclo mi loggo e poi mi disconnetto (la macro si ripete all'infinito). Per evitare di fare questo ho pensato di usare diversi browser, quindi ad ogni browser corrisponde un account che rimane connesso (evito in questo modo la fase di autenticazione che purtroppo a volte da dei problemi).

Adesso ho un problema: in modo casuale Vba mi da "l'errore di run-time '91. Variabile oggetto o variabile del blocco With non impostata" e questo avviene quando IE non riesce a caricare la pagina e infatti su Internet explorer ho l'errore "impossibile visualizzare la pagina Web". Tendo a precisare che la connessione funziona benissmo, infatti se apro un'altra pagina web non ho nessun problema.
La parte iniziale del codice è:

Codice: Seleziona tutto
...
' Cancella IE cronologia
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255"

'Attesa 3 Secondi
    myStart = Timer
    Do
        DoEvents
        If Timer > myStart + 3 Or Timer < myStart Then Exit Do
    Loop

'loop infinito
Do

    I = 0

'verifica di essere log off
    myURL = "link..."
    Set IE = CreateObject("InternetExplorer.Application")
       
    With IE
        .navigate myURL
        .Visible = True
        Do While .Busy: DoEvents: Loop
        Do While .ReadyState <> 4: DoEvents: Loop
    End With

'Attesa 5 Secondi
    myStart = Timer
    Do
        DoEvents
        If Timer > myStart + 5 Or Timer < myStart Then Exit Do
    Loop

'Ciusura IE
    IE.Quit
    Set IE = Nothing


'log IN
    myURL = "link..."
    Set IE = CreateObject("InternetExplorer.Application")
       
    With IE
        .navigate myURL
        .Visible = True
        Do While .Busy: DoEvents: Loop
        Do While .ReadyState <> 4: DoEvents: Loop
    End With

    myStart = Timer
    Do
        DoEvents
        If Timer > myStart + 3 Or Timer < myStart Then Exit Do
    Loop

    IE.Document.forms(0).all("username").Value = "username"
    IE.Document.forms(0).all("password").Value = "password"
    IE.Document.forms(0).submit

' attesa 20 secondi per essere sicuri che il log in si avvenuto
    myStart = Timer
    Do
        DoEvents
        If Timer > myStart + 20 Or Timer < myStart Then Exit Do
    Loop
   
'inizio programma

    myURL = "link..."
    Set IE = CreateObject("InternetExplorer.Application")

    Sheets("Foglio1").Select
    Range("A:B").Clear
       
    With IE
        .navigate myURL
        .Visible = True
        Do While .Busy: DoEvents: Loop
        Do While .ReadyState <> 4: DoEvents: Loop
    End With

    myStart = Timer
    Do
        DoEvents
        If Timer > myStart + 3 Or Timer < myStart Then Exit Do
    Loop

    'cerca ed elenca Id e Descrizioni
    Set myColl = IE.Document.getElementsByTagName("a")
    For Each myLink In myColl
        LLin = myLink.href
...


Cercando su internet ho trovato questa verifica che serve per essere sicuri che la pagina internet è stata caricata. Non Ho capito come usarla. A me serve che la macro non vada in errore altrimenti mi blocca il loop.

Codice: Seleziona tutto
On Error Resume Next
WebBrowser1.Navigate "about:blank"
DoEvents

Do
    Err.Clear
    WebBrowser1.Document.body.innerhtml = "Attendi..."
    If Err.Number = 0 Then Exit Do
    DoEvents
Loop
On Error GoTo 0

' ora puoi navigare dove vuoi
WebBrowser1.Navigate "http://www.ilmiosito.com"


Grazie e spero di essere stato chiaro.
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 02/02/13 23:21

Invece di usare diversi browser (hai capito che Microsoft non ha nessun interesse a supportare ambienti di terze parti) puoi usare diverse sessioni di IE, all' interno della quale fai una gestione continuativa senza doversi loggare in continuazione e chiudere la sessione a fine della singola operazione.
Quindi in un oggetto diciamo IE1 fai un tipo di gestione, in IE2 ne fai un' altra, e cosi' via; tenendo ovviamente traccia di che cosa fai in IE1 e che cosa fai in IE2; e procedendo in ogni caso ogni tot di tempo a chiudere tutte le sessioni per evitare problemi di occupazione di memoria.
Per controllare che la pagina caricata sia proprio quella cercata io uso
Codice: Seleziona tutto
   Do While .ReadyState <> 4: DoEvents: Loop   'Esistente
End With        'Esistente
'AGGIUNTO:
CUrl = IE.LocationURL   'Current URL
If CUrl <> myUrl Then     'Current <> quello impostato
'cosa fare...
End if
Presuppone che sia settato il riferimento alla libreria Microsoft Internet Controls (ieframe.dll), cosa che puoi fare a mano (Menu /Strumenti /Riferimenti) oppure inserendo una userform inutile contenente lo strumento "WebBrowser" (se non lo vedi, cercalo in Menu /Strumenti /Controlli aggiuntivi).
Cosa fare in caso di Url diverso da quello impostato dipende dal tuo flusso: all' inizio potra' essere una call al login, poi presumibilmente sara' un ritentare la fase di Navigate.

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 03/02/13 13:39

Ciao Anthony47. Quello che dice è molto interessante ma sinceramente non ho capito come fare. Con il comando

Shell("C:\..\iexplore.exe -nomerge http://www.yoursite...)

riesco ad aprire diverse sessioni di IE. Non riesco a capire come identificare le sessione per poterle gestire. Per esempio per poter aprire tre sessioni di IE con tre account di questo sito (faccio riferimento alla macro scritta da te in un altra discussione per loggarsi a questo forum) come devo fare?
Purtroppo non riesco a trovare molte discussioni su questo argomento.

Grazie e ciao
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 04/02/13 00:36

Scusa, ma i pezzi di codice che hai pubblicato operano ben su sessioni di internet explorer che sono "legate" alla tua automazione... ??!?
Io ti ho solo suggerito di creare piu' sessioni, in alternativa alla richiesta di lavorare su browser diversi.
Siccome Io continuo a immaginare che usi Set IE = CreateObject("InternetExplorer.Application") (e questa "immaginazione" l' ho presentata piu' volte senza mai ricevere una conferma o una smentita) ampliando la mia "immaginazione" con queste istruzioni creerai due oggetti:
Codice: Seleziona tutto
Set IE = CreateObject("InternetExplorer.Application")
Set IE2 = CreateObject("InternetExplorer.Application")
Avrai cosi' due "oggetti" all' interno dei quali potrai creare due automazioni parallele, senza il bisogno di terminare la prima per avviare la seconda; ovviamente dovrai sapere e ricordare che, ad esempio, in IE ti sei loggato e stai operando sul tuo database degli ordini mentre in IE1 sei loggato sul database della produzione.
Creare istanze di I.E. tramite Shell e poi dover risolvere il problema di "legare" queste sessioni alla tua automazione mi sembra invece una complicazione, rispetto a quanto "immagino" io, dove l' automazione crea l' istanza gia' legata all' automazione.

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 04/02/13 10:37

Ciao. Ti confermo che uso il comando Set IE = CreateObject("InternetExplorer.Application") (fai conto che fino a 10 giorni fa non conoscevo nulla di VBA e sto prendendo spunto dai tuoi esempi sparsi per il forum). Il problema è che con questo comando non si aprono sessioni diverse di IE ma solo della pagine diverse. Avevo già provato quanto suggerito da te ma non funziona. Invece con il comando che ho trovato facendo una ricerca su altri forum

Shell("C:\..\iexplore.exe -nomerge link)

effettivamente si aprono sessioni diverse di IE completamente indipendenti. In questo modo si può effettuare il login allo stesso sito con diverse credenziali. Il problema è capire come si gestiscono.

Grazie.
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 04/02/13 12:07

Ti confermo che usando
Codice: Seleziona tutto
Set IE = CreateObject("InternetExplorer.Application")
Set IE2 = CreateObject("InternetExplorer.Application")
avrai due sessioni diverse di internet explorer legate alle tue automazioni; tu invece dici che sia facendo riferimento all' oggetto IE che all' oggetto IE1 i tuoi comandi si applicano alla stessa sessione?

Per prova, crea i due oggetti IE ed IE2 e naviga a due indirizzi diversi; lo puoi ottenere con questo codice:
Codice: Seleziona tutto
Sub Soloprova()
Set IE = CreateObject("InternetExplorer.Application")
Set IE2 = CreateObject("InternetExplorer.Application")

myURL = "link 1..."
my URL2= "link 2..."   
    With IE
        .navigate myURL
        .Visible = True
    End With
    With IE2
        .navigate myURL2
        .Visible = True
    End With
Stop
IE.Quit
IE2.Quit
Set IE = Nothing
Set IE2 = Nothing
End Sub

La macro si fermera' sulla riga Stop: controlla quindi se hai le due pagine ambedue visualizzabili e, tramite TaskManager di Windows, controlla quanti processi iexplore.exe hai in memoria PRIMA di eseguire il codice e DOPO averlo eseguito (fermo su Stop).
Completa poi la macro per chiudere le sessioni.

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

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi mark64 » 04/02/13 22:31

Ciao. Mi sono accorto che le sessioni di IE non sono molto affidabili. L'ho testato con due account di posta elettronica di libero. Per quanto riguarda il codice che hai postato il problema è che nel mio caso il link è sempre lo stesso (se lo provi con due account di posta elettronica ti accorgi, almeno da quanto ho verificato facendo delle prove, che con il comando CreateObject("InternetExplorer.Application") si aprono più pagine di internet explorer ma non sessioni diverse e indipendenti di IE). La soluzione che mi rimane è quella di usare il codice che ho già scritto che prevede il login e logout ad ogni ciclo (devo solo travare un modo per evitare che vada in errore se non viene caricata la pagina).
L'alternativa è quella di usare più browser ma da quel poco che ho capito è una cosa molto difficile se non impossibile.

Grazie per il tua aiuto.
mark64
Utente Junior
 
Post: 14
Iscritto il: 10/03/10 03:55

Re: Importare sorgente pagina web e salvare risultati in txt

Postdi Anthony47 » 05/02/13 02:52

il problema è che nel mio caso il link è sempre lo stesso (se lo provi con due account di posta elettronica ti accorgi, almeno da quanto ho verificato facendo delle prove, che con il comando CreateObject("InternetExplorer.Application") si aprono più pagine di internet explorer ma non sessioni diverse e indipendenti di IE)
Ma per prova puoi usare il codice che ti ho dato con due link diversi, cosi' puoi accorgerti se un comando governa un "oggetto" e un altro governa quell' altro? Quello che conta e' l' associazione con IE e con IE2; una fara' riferimento a un oggetto, l' altro all' altro oggetto.
E la verifica con TaskManager che esito ha dato?

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


Torna a Applicazioni Office Windows


Topic correlati a "Importare sorgente pagina web e salvare risultati in txt":


Chi c’è in linea

Visitano il forum: Carletto Ribolla e 53 ospiti