Condividi:        

Google sheet - =IMPORTXML

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

Google sheet - =IMPORTXML

Postdi Gattuccio0 » 14/02/21 19:51

Ciao a tutti,
avrei la necessità da un dato link esportare in Excel dei dati contenuti in una pagina html.

In particolar modo, dovrei esportare dei dati di ristoranti da TripAdvisor.

Ho optato per GoogleSheet cercando di personalizzare la funzione importxml.
Le colonne che dovrei avere sono:
Link;Nome ristorante;Indirizzo;Telefono;sitoweb;mail;fascia_prezzo;tipo_cucina; ecc. (allego il file Excel versione 2010 https://we.tl/t-SIyNIR2hcy)

Su GoogleSheet da B2 in avanti, ho provato ad inserire delle funzioni ma mi riportano tropper info:

b2 =IMPORTXML (A2;"//title/text ()")
c2 =IMPORTXML(A2; "//meta[@name='description']/@content")
d2 =IMPORTXML(A2;"//meta[@name='keywords']/@content")

Vedendo la struttura della pagina html, ho visto che ci sono delle celle fisse (che suppongo contengano l'info che deve essere estrapolata) ma non riesco in nessun modo a crearle in modo esatto.
Ho provato anche con una funzione più lunga (per esempio per estrarre il nome del ristorante):
=importxml("https://www.tripadvisor.it/Restaurant_Review-g1006068-d1011772-Reviews-Ristorante_Due_Spade-Cernusco_sul_Naviglio_Province_of_Milan_Lombardy.html";"//div[@class="_3a1XQ88S"]//li")

Ma non ho avuto alcun successo.
Vi ringrazio anticipatamente.
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Sponsor
 

Re: Google sheet - =IMPORTXML

Postdi Anthony47 » 15/02/21 02:37

Ma quella query non produce un risultato in formato xml (ma html), quindi il suo utilizzo e' abbastanza problematico perche' "l'XPath" e' meno certo che nel rigido formalismo xml.
Comunque, avendo il link in A2:
per l'inndirizzo:
Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""component_35""]/div/div[3]/span[1]/span/a")

per il telef:
Codice: Seleziona tutto
=IMPORTXML(A2;"//span[@class=""_15QfMZ2L""]")

per il sito web, dovrebbe essere (secondo la mia migliore interpretazione) ma non ha restituito dati:
Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""component_35""]/div/div[3]/span[3]/span/a/@href")

Ho ottenuto gli xpath tramite la funzione "Ispeziona elemento" + "Copia xPath" che il browser mette a disposizione

Per gli altri prova tu con un po' di pazienza e certamente ne verrai fuori; solo ricorda che xPath va inserito tra "virgolette" nella formula, ed eventuali VIRGOLETTE gia' presenti nel xPath devono essere raddoppiate (come vedi ad esempio in id=""component_35""], sopra

Per le informazioni teoriche di xPath: https://www.w3schools.com/xml/xpath_intro.asp

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

Re: Google sheet - =IMPORTXML

Postdi Gattuccio0 » 15/02/21 10:29

Grazie molte Anthony,
con i tuoi esempi ho capito cosa e dove estrapolare...e soprattutto il discorso delle doppie virgolette è stato fondamentale.

Grazie e buona giornata.
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Google sheet - =IMPORTXML

Postdi Gattuccio0 » 17/02/21 10:42

Ciao Anthony,
ho fatto delle prove:

Sono riuscito a trovare la mail così:

Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""component_36""]/div[2]/div/div[3]/div/div/div[2]/div[2]/span/a/@href")


Per il sito web sono arrivato a questo punto (ancora impreciso):

Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""component_36""]/div/div/div[3]/div/div/div[2]/div[1]/span/a")


In quanto non estrapola il collegamento ipertestuale ma mi fa apparire la scritta "Sito web".

Ho a questo punto un dubbio vedendo anche le precedenti formule: in alcune si deve inserire la classe in altre no. Da cosa dipende questa scelta?
Io andando sul codice copio la XPath (che mi riporta delle info più o meno strutturate allo stesso modo).
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Google sheet - =IMPORTXML

Postdi Anthony47 » 17/02/21 15:46

Per la mail funziona pure
Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""SAFETY_ANCHOR""]/div/div/div/div[2]/div[1]/div[2]/div[2]/div[1]/div[3]/a/@href")

Quanto al "sito web", l'xPath che avevo indicato punta correttamente all'elemeno che contiene il link:
//*[@id="component_35"]/div/div[3]/span[3]/span/a

Infatti riesca a estrarre gli attributi "data-encoded-url", "class" e "target", con le formule
Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""component_36""]/div[2]/div/div[3]/div/div/div[2]/div[1]/span/a/@data-encoded-url")
=IMPORTXML(A2;"//*[@id=""component_36""]/div[2]/div/div[3]/div/div/div[2]/div[1]/span/a/@class")
=IMPORTXML(A2;"//*[@id=""component_36""]/div[2]/div/div[3]/div/div/div[2]/div[1]/span/a/@target")

Provata anche l'istruzione
Codice: Seleziona tutto
=IMPORTXML(A2;"//*[@id=""component_36""]/div[2]/div/div[3]/div/div/div[2]/div[1]/span/a/@*")
Questa dovrebbe restituire tutti gli attributi del nodo, ma ne restituisce solo 3 e non il 4° (href, appunto)

Cioe' non riesce a estrarre il 4° attributo; in altre posizioni invece l'href viene correttamente estratta, pertanto mi sono fatto l'idea che oltre un certo livello i parametri possano essere non estratti correttamente, ma non ho trovato nessuna documentazione che confermi o smentisca. Anzi ho trovato situazioni in cui IMPORTXML riesce ad importare il 4° attributo ma non il 5°, con stringhe pero' piu' corte, che farebbe pensare ci sia un limite di lunghezza. Ma il dubbio rimane

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

Re: Google sheet - =IMPORTXML

Postdi Gattuccio0 » 18/02/21 10:55

Grazie ancora per le risposte. Non demordo. Continuerò a fare delle prove fino a quando non riesco nell'intento.

Conoscendo la tua esperienza immagino che con VBA ci vorrebbe un attimo
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Google sheet - =IMPORTXML

Postdi Anthony47 » 18/02/21 16:23

Teoricamente con Excel + vba non sarebbe difficile.
Ad esempio con questo codice:
Codice: Seleziona tutto
Dim IE As Object
#If VBA7 Then       '!!! ON  TOP  OF  THE  VBA  MODULE   !!!!
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub TripAd()
''Dim IE As Object
Dim myDoc, myF
Dim oColl, Out(1 To 8) As String

myUrl = Cells(2, 1).Value             'L'url della pagina da accedere
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If InStr(1, myUrl, "http", vbTextCompare) = 1 Then
        If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
        mystart = Timer
        With IE
            .Visible = True         '... rendi visibile IE
            .Navigate myUrl         '...vai all'url
            Sleep 50
            Do
                DoEvents: Sleep (30)
                If .busy = False Then Exit Do
            Loop  'Attesa not busy
            Do While .ReadyState <> 4: DoEvents: Sleep (30)
            Loop 'Attesa documento
        End With
        Erase Out
        On Error Resume Next
            Out(1) = IE.document.getElementsByClassName("_3a1XQ88S")(0).innerText
            Out(2) = IE.document.getElementsByClassName("_2saB_OSe")(0).innerText
            Out(4) = IE.document.getElementsByClassName("_2saB_OSe")(1).parentElement.href
            Out(5) = IE.document.getElementsByClassName("_2saB_OSe")(2).parentElement.href
            Out(3) = IE.document.getElementsByClassName("_2saB_OSe")(3).parentElement.parentElement.href
            Out(6) = IE.document.getElementsByClassName("_1XLfiSsv")(0).innerText
            Out(7) = IE.document.getElementsByClassName("_1XLfiSsv")(1).innerText
            Out(8) = IE.document.getElementsByClassName("_1XLfiSsv")(2).innerText
            Cells(i, 2).Resize(1, UBound(Out)).Value = Out
        On Error GoTo 0
    End If
Next i
IE.Quit
Set IE = Nothing
End Sub

Inseriscilo in un modulo vba standard VUOTO. Poi all'occorrenza lanci la Sub TripAd.
Questa esamina i link del foglio selezionato, da A2 verso il basso, e di ognuno estrae e inserisce nelle colonne B:I le informazioni rilevate.

Il problema sta nel fatto che con I.E. quelle pagine si aprono lentissimamente (a me ognuna richiede 30-40 secondi!), per cui rischi di diventare vecchio davanti al pc.

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

Re: Google sheet - =IMPORTXML

Postdi Gattuccio0 » 18/02/21 18:32

Caspita...va benissimo con IMPORT...si tratta di 5 link che alla fine ho fatto manualmente.
Ad ogni modo ci lavoro nei momenti liberi per trovare la soluzione!
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Google sheet - =IMPORTXML

Postdi Anthony47 » 19/02/21 10:12

Non ho capito se "funziona benissimo" (chi /che cosa?) o se devi ancora "trovare la soluzione" :-?
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Google sheet - =IMPORTXML

Postdi Gattuccio0 » 19/02/21 10:48

Intendevo che, richiedendo 40 secondi a record per la macro, pensavo di proseguire con IMPORT: lì si tratta di trascinare la cella con la formula ed in 40 secondi ti rilascia i risultati. Tutti tranne che del link al sito ;-)

Ho provato la macro ma mi da errore di compilazione:

Errore di compilazione:

Costanti, stringhe di lunghezza fissa, matrici, tipi definiti dall'utente e istruzioni Declare non ammessi come membri Public di moduli di oggetto

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Google sheet - =IMPORTXML

Postdi Anthony47 » 19/02/21 10:58

Anche se hai quell'errore la macro dovresti riuscire a eseguirla; prova.
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Google sheet - =IMPORTXML

Postdi Gattuccio0 » 19/02/21 14:36

non esegue niente: in A2 ho messo il link. Lancio la macro, appare il segnale di errore, do l'ok ma nel foglio non viene visualizzata nessuna estrazione dei dati
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Google sheet - =IMPORTXML

Postdi Anthony47 » 19/02/21 19:40

Codice: Seleziona tutto
#If VBA7 Then       '!!! ON  TOP  OF  THE  VBA  MODULE   !!!!
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Questa e' una "compilazione condizionale": se e' in uso il VBA versione 7 la dichiarazione e' fatta usando il tipo dati LongPtr, presente dal vba7 in avanti (da Office 2010 in avanti).
Sui sistemi con Vba versione 6, che non ha il tipo LongPtr, la dichiarazione e' fatta con tipo dati Long.

Su vba 6 l'istruzione che a te va in errore viene visualizzata in Rosso perche' la sintassi gli e' sconosciuta (provata su XL2003), ma siccome l'istruzione e' poi ignorata queste dichiarazioni funzionano correttamente.

Insomma non so spiegare perche' ti esce il messaggio di errore visto che se hai Vba 6 la riga viene ignorata e se hai Vba 7 quel tipo dati esiste...
Quanto alla lentezza, credo che il sito tripadvisor sia assolutamente disottimizzato per IE: se infatti lanci IE e provi ad andare sull'url del ristorante vedrai che per decine e decine di secondi il sito rimane in caricamento; su un Pc mi e' uscito il messaggio che uno script stava impiegando troppo a completarsi. Su Edge e altri browser invece in pochi secondi il caricamento e' completo, solo che la loro compatibilita' col vba e' piu' complessa.

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


Torna a Applicazioni Office Windows


Topic correlati a "Google sheet - =IMPORTXML":

Google vocale
Autore: crisge73
Forum: Discussioni
Risposte: 19

Chi c’è in linea

Visitano il forum: Nessuno e 19 ospiti