Estrarre dati da pagina web

di il
20 risposte

Estrarre dati da pagina web

Ciao 

Volevo chiedervi un consiglio..
Utilizziamo una piattaforma Autodesk che crea delle matrici di interferenza e crea delle tabelle a video. Purtroppo non c'è la possibilità di esportare le tabelle in excel o altro, l'unica cosa che posso fare è salvare la pagina in html.

L'idea è quella di leggere il file html ed estrapolare i dati della tabella e poi salvare un excel.

C'è qualche libreria che posso utilizzare o altro metodo?

la pagina html di esempio è questa: OneDrive.zip

Grazie STefano

20 Risposte

  • Re: Estrarre dati da pagina web

    Ma crea le tabelle in un browser? scegli tu il browser valorizzando l'url nel browser di tua scelta?

  • Re: Estrarre dati da pagina web

    La piattaforma è web e si apre con un browser

    Crea la pagina web con la tabella..ma non permette di salvare la tabella in un formato che poi posso aprire

  • Re: Estrarre dati da pagina web

    Hai parecchie soluzioni che puoi adottare, tutto dipende dalla complessità del codice HTML e dalle tue conoscenze.

    Se il codice HTML è abbastanza semplice, leggi il file su una variabile e poi lo analizzi usando le RegularExpression.
    Se vuoi una mano chiedi pure, fammi capire bene dal file HTML che hai allegato quali sono i dati che devi estrarre, e vediamo come fare.

    Se la complessità è media, puoi usare la libreria HAP (HTML Agility Pack) che permette di analizzare codice HTML in maniera molto più semplice ma devi studiare un po' il linguaggio da usare.

    Per livelli ancora più alti puoi usare Selenium che sfrutta Google Chrome, ma lo lascierei come ultima spiaggia, solo se la pagina contiene JavaScript che deve essere eseguito.

    Una volta estratto i dati puoi creare un file CSV, oppure un file XLS o XSLX

  • Re: Estrarre dati da pagina web

    Prima di tutto grazie per il tuto tempo..

    Allora la pagina che crea la piattaforma è questa:

    La tabella è quella nel frame di destra
    Se salvo la pagina questo è il risultato:

    A parte la grafica che non mi interessa, vorrei ricreare la stessa tabella

    Con VB.NET un po' me la cavo, HTML lo conosco poco, e non so dirti che tipo è, la pagina salvata è questa:
    OneDrive.zip

    Comincio a vedere HTML Agility Pack

  • Re: Estrarre dati da pagina web

    Posso salvarlo anche in questo modo:

    Interferenze - Autodesk Model Coordination2.zip

  • Re: Estrarre dati da pagina web

    Sono partito da questo, ma credo che non riesca a trovare la tabella

         Dim web As New HtmlAgilityPack.HtmlWeb
         Dim doc As HtmlAgilityPack.HtmlDocument = web.Load("c:\users\carta\downloads\Interferenze - Autodesk Model Coordination.html")
         Dim tables As HtmlAgilityPack.HtmlNodeCollection = doc.DocumentNode.SelectNodes("//TABLE")
    
         ' Iterate all rows in the first table
         Dim rows As HtmlAgilityPack.HtmlNodeCollection = tables(0).SelectNodes("./TR")
         For i As Integer = 0 To rows.Count - 1
    
             ' Iterate all columns in this row
             Dim cols As HtmlAgilityPack.HtmlNodeCollection = rows(i).SelectNodes(".//TD")
             For j As Integer = 0 To cols.Count - 1
    
                 ' Get the value of the column and print it
                 Dim value As String = cols(j).InnerText
                 ListBox1.Items.Add(value)
             Next
         Next
        
  • Re: Estrarre dati da pagina web

    Ci sono riuscito grazie alle tue indicazioni ed utilizzando SELENIUM

    non sarà il massimo come ottimizzazione ma funziona
    Grazie!!

    Imports System
    Imports System.Threading
    Imports OpenQA.Selenium
    Imports OpenQA.Selenium.Chrome
    Imports OpenQA.Selenium.Firefox
    
    Imports ClosedXML.Excel
    Imports System.Reflection
    Imports System.ComponentModel
    Imports DocumentFormat.OpenXml.Spreadsheet
    
    
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            'https://acc.autodesk.eu/model/clashes/projects/775f680f-2f63-4131-af81-da572540e1bf/model-set/44954830-e197-4f8c-a38b-19a106f3cb2d
            Dim rigaList As New List(Of String)
            Dim ColonnaList As New List(Of String)
    
            Dim driver As IWebDriver = New ChromeDriver()
            driver.Manage().Window.Maximize()
    
            driver.Navigate().GoToUrl("C:/Users/carta/Downloads/Interferenze%20-%20Autodesk%20Model%20Coordination.html")
            'driver.Navigate().GoToUrl("https://acc.autodesk.eu/model/clashes/projects/775f680f-2f63-4131-af81-da572540e1bf/model-set/44954830-e197-4f8c-a38b-19a106f3cb2d")
    
            'driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(30))
            Dim elemTable = driver.FindElement(By.ClassName("BaseTable"))
            Dim lstTrElem As List(Of IWebElement) = New List(Of IWebElement)(elemTable.FindElements(By.ClassName("BaseTable__row")))
            Dim strRowData As String = ""
    
            For Each elemTr In lstTrElem
                Dim lstTdElem As List(Of IWebElement) = New List(Of IWebElement)(elemTr.FindElements((By.ClassName("BaseTable__row-column"))))
    
                If lstTdElem.Count > 0 Then
    
                    Dim tmpModello As String = lstTdElem(0).Text
    
                    Dim tmpModelloNome As String() = tmpModello.Split(vbCrLf)
    
                    If tmpModelloNome.Count > 1 Then
                        ColonnaList.Add(tmpModelloNome(0))
    
                    Else
    
                        ColonnaList.Add(tmpModelloNome(0))
                    End If
    
                    Dim ctrlColUno As Boolean = True
    
                    For Each elemTd In lstTdElem
    
                        Dim tmp = elemTd.Text
    
                        Dim tmpRiga As String() = elemTd.Text.Split(vbCrLf)
    
                        If ctrlColUno = True Then
    
                            If tmpRiga.Count > 1 Then
                                strRowData = strRowData & tmpRiga(0) & "|" & tmpRiga(1) & "|"
                            Else
                                strRowData = strRowData & tmpRiga(0) & "|" & "NULL" & "|"
                            End If
    
                            ctrlColUno = False
                        Else
    
                            If tmpRiga(0) <> "" Then
                                strRowData = strRowData & tmpRiga(0) & "|"
                            Else
    
                                strRowData = strRowData & "NULL" & "|"
                            End If
    
    
    
                        End If
    
                    Next
    
                End If
    
                rigaList.Add(strRowData)
    
    
                Console.WriteLine(strRowData)
                strRowData = String.Empty
            Next
    
            Console.WriteLine("")
            driver.Quit()
    
            Dim workbook = New XLWorkbook("C:\ctrlFasi\matrice_template.xlsx")
    
            Dim xlworksheet_Matrice = workbook.Worksheet("Matrice")
    
            Try
    
                Dim col = 3
                For Each Colonna As String In ColonnaList
    
                    xlworksheet_Matrice.Cell(1, col).Value = Colonna
                    col += 1
                Next
                col = 1
                Dim rig = 2
                For Each riga As String In rigaList
    
                    Dim tmpRiga As String = riga
                    'tmpModello = tmpModello.Replace(vbCrLf, "")
    
                    Dim tmpRigaSplit As String() = riga.Split("|"c)
    
                    For Each Cella As String In tmpRigaSplit
    
                        If Cella <> "NULL" Then
                            xlworksheet_Matrice.Cell(rig, col).Value = Cella
                        Else
                            xlworksheet_Matrice.Cell(rig, col).Value = ""
                        End If
    
                        col += 1
                    Next
    
    
                    rig += 1
                    col = 1
    
                Next
    
                workbook.SaveAs("C:\ctrlFasi\prova.xlsx")
    
                workbook.Dispose()
    
            Catch ex As Exception
                Workbook.Dispose()
    
            End Try
    
        End Sub
    
    
    
  • Re: Estrarre dati da pagina web

    Sono contento che hai risolto, ma come ti dicevo Selenium era proprio l'ultimo tentativo da fare, hai usato un elefante per tirare una bicicletta.

    Se hai qualche giorno di tempo provo a dare un'occhiata al tuo HTML e ti faccio un programmino con le RegularExpression per estrarre i dati

  • Re: Estrarre dati da pagina web

    Grazie…così studio un altro sistema

  • Re: Estrarre dati da pagina web

    Mi puoi dare il file XLSX di quello che vuoi ottenere ??

  • Re: Estrarre dati da pagina web

    Ciao..

    ecco il file excel

    prova.xlsx

    oggi ho provato a creare sulla piattaforma, una tabella più grande e salvarla come facevo ieri in HTML
    ho lanciato il programmino, ma sembra che tira fuori solo la parte di tabella che era visibile a schermo, e non l'intera tabella, è come se fosse dinamica a seconda delle barre di scorrimento

    Non so come spiegarti..te lo dovrei far vedere

  • Re: Estrarre dati da pagina web

    18/10/2024 - hantrax ha scritto:


    sembra che tira fuori solo la parte di tabella che era visibile a schermo, e non l'intera tabella, è come se fosse dinamica a seconda delle barre di scorrimento

    Ahi ahi, questo potrebbe essere un problema.
    Altra prova da fare: prendi la tabella grande come hai detto tu e salvala in formato MHTML, secondo me lì dovrebbe metterci tutto, vediamo se possiamo estrarre tutto da lì

  • Re: Estrarre dati da pagina web

    Allora ho trovato un modo per fagli salvare tutta la tabella, mi devo mettere su uno schermo 4k ridurre al minimo lo zoom della pagina e salvare..aquel punto salva tutta la tabella

    ecco la tabella in mhtml

    pagina_unica.mhtml

    per vederla tutta riduci lo zooom

  • Re: Estrarre dati da pagina web

    Partendo da pagina_unica.mhtml ecco il risultato che ottengo, ti potrebbe andar bene ???

    https://www.sirjo.com/result.csv

    P.S.: per ora ho fatto un formato CSV perchè più comodo, poi ovviamente ti cambierai tu il formato in quello che vuoi

    P.S.2: ma sei sicuro che non c'è altro modo per creare il file MHTML che contenga tutto ??

Devi accedere o registrarti per scrivere nel forum
20 risposte