Raschiare il testo dal sito web utilizzando VBA di Excel?

Io sono abbastanza nuovo per l’utilizzo di Excel come una pagina web scraper, ma ho trovato questo molto interessante articolo spiegare come raschiare alcuni tag di un sito web utilizzando VBA di Excel. Ho il seguente codice che funziona bene, ma si ottiene solo il contenuto del primo <p> tag che trova:

Sub get_title_header()
Dim wb As Object
Dim doc As Object
Dim sURL As String
Dim lastrow As Long
lastrow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To lastrow
Set wb = CreateObject("internetExplorer.Application")
sURL = Cells(i, 1)

wb.navigate sURL
wb.Visible = True

While wb.Busy
    DoEvents
Wend

'HTML document
Set doc = wb.document

Cells(i, 2) = doc.title

On Error GoTo err_clear
Cells(i, 3) = doc.GetElementsByTagName("p")(0).innerText
err_clear:
If Err <> 0 Then
Err.Clear
Resume Next
End If
wb.Quit
Range(Cells(i, 1), Cells(i, 3)).Columns.AutoFit
Next i

End Sub

Ora quello che vorrei fare è modificare il codice e fare il raschietto per ottenere tutto il contenuto all’interno di una <p> tag su una pagina web. Quindi credo che un foreach la funzionalità di alcune specie mancante.

Speriamo che qualcuno è disposto ad aiutarmi a diffondere il codice, in modo che il contenuto da più <p> tag saranno raccolti.

AGGIORNAMENTO
Di seguito il codice di lavoro!

Sub get_title_header()
Dim wb As Object
Dim doc As Object
Dim sURL As String
Dim lastrow As Long
Dim i As Integer
lastrow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To lastrow
Set wb = CreateObject("internetExplorer.Application")
sURL = Cells(i, 1)

wb.navigate sURL
wb.Visible = True

While wb.Busy
    DoEvents
Wend

'HTML document
Set doc = wb.document

Cells(i, 2) = doc.Title

On Error GoTo err_clear

Dim el As Object
For Each el In doc.GetElementsByTagName("p")

counter = counter + 1
    Cells(i, counter + 2).Value = Cells(counter + 1).Value & el.innerText

Next el
counter = 0

err_clear:
If Err <> 0 Then
Err.Clear
Resume Next
End If
wb.Quit
Range(Cells(i, 1), Cells(i, 10)).Columns.AutoFit
Next i

End Sub

OriginaleL’autore RobbertT | 2015-04-23

One Reply
  1. 5

    Ci sei quasi! doc.GetElementsByTagName("p") restituisce una collezione di HTMLParagraphElement oggetti di cui accede la prima voce utilizzando doc.GetElementsByTagName("p")(0). Come si allude a un For Each loop consentono di accedere ogni volta:

    Sub get_title_header()
    Dim wb As Object
    Dim doc As Object
    Dim sURL As String
    Dim lastrow As Long
    Dim i As Integer
    lastrow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = 2 To lastrow
    Set wb = CreateObject("internetExplorer.Application")
    sURL = Cells(i, 1)
    
    wb.navigate sURL
    wb.Visible = True
    
    While wb.Busy
        DoEvents
    Wend
    
    'HTML document
    Set doc = wb.document
    
    Cells(i, 2) = doc.Title
    
    On Error GoTo err_clear
    
    Dim el As Object
    For Each el In doc.GetElementsByTagName("p")
        Cells(i, 3).Value = Cells(i, 3).Value & ", " & el.innerText
    Next el
    
    err_clear:
    If Err <> 0 Then
    Err.Clear
    Resume Next
    End If
    wb.Quit
    Range(Cells(i, 1), Cells(i, 3)).Columns.AutoFit
    Next i
    
    End Sub
    Ciao grazie, provato il tuo codice ma non restituisce nulla.. manca qualcosa? Grazie ancora!
    Ho copiato il codice che ho provato. Si sa versione modificata del codice che non ha alcun del foglio di lavoro, i riferimenti per la semplicità. Inoltre, tutto l’output va alla finestra immediata (Ctrl+G). Questo ha funzionato perfettamente sul mio PC e non dovrebbe essere difficile da modificare come necessario per i vostri scopi
    Impressionante, che ha funzionato! tuttavia ancora cercando di capire come farlo funzionare con l’url nella colonna a e la p contenuto nella colonna b del foglio di excel.. Si potrebbe scaricare l’esempio in fondo all’articolo che ho citato, per capire cosa intendo. Grazie
    Di nuovo, si erano quasi arrivati. Questo solo loop attraverso ogni <p> tag e consente di concatenare il testo della stringa che è già in colonna 3
    Questo è così incredibilmente cool, non avevo idea di una cosa del genere era possibile con Excel. Fantastico, funziona come un fascino. Richiesta di un altro; è possibile inserire il contenuto di ogni <p> si trovano in una stanza separata cella (colonna) sulla stessa riga? Thaanks!

    OriginaleL’autore stucharo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *