Estrarre dati da pagina web

di il
7 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

7 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
    
    
    
Devi accedere o registrarti per scrivere nel forum
7 risposte