Italian Interpretare una tabella HTML

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho una pagina HTML con contiene una singola tabella composta dai tag <TABLE>, <TR>, <TD> <COLSPAN=..> <ROWSPAN=..> e ovviamente </TABLE>, </TR>, </TD>.
All'interno di questa tabella e dei citati tag ci sono elementi che vorrei eliminare. Ad esempio (elenco parzialissimo) :
class = 'mat'
class="mat"
COLOR= "#000000"
id = 'nodecBlack'
ecc. ecc. ecc.
Con virgole, apici e spazi messi un po' a caso tanto per farmi dannare ;-)
Io vorrei LASCIARE solo <TABLE>, <TR>, <TD> <COLSPAN=..> <ROWSPAN=..>, </TABLE>, </TR> e </TD> in modo da avere una tabella pulita. Questa tabella è abbastanza facile da interpretare ei trasformare il contenuto fra i tag <TD> e </TD> in un elemento di un array bidimensionale.
Dim Contenuto(NumeroColonne,NumeroRighe) as string
Per adesso non ho trovato altra via che quella di utilizzare in modo massivo e per innumerevoli volte la funzione Replace(tag,"") ma, esaminando varie pagine HTML, salta sempre fuori qualche tag non considerato che mi fa saltare tutto.
La domanda è: esiste un modo migliore che prenda in considerazione tutti ma proprio tutti i casi di tag "spuri" e faciliti assai l'interpretazione dei contenuti della tabella ?
Grazie per l'attenzione.
 

calsdn

Member
Licensed User
Se non ricordo male qualsiasi cosa non sia informazione 'vera e propria' in HTML è racchiusa tra "<" e ">".
Quindi penso si debba costruire una funzione che dopo il "<td>" cerchi il primo "<" (che non sia un "</td>") ne trovi poi il ">" e elimini il contenuto.
Questo finché non si trova un "</td>", quello che rimane è l'informazione pulita.
Applichi la funzione ad ogni cella.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Il tuo suggerimento può essere valido; l'unica è sperimentare per vedere se non salta fuori qualche inghippo (cosa assai probabile vista la complessità e la variabilità della pagina HTML)
In realtà io cercavo una soluzione più semplice che utilizzasse funzioni già esistenti. Qualcosa come HTMLDecode o similari.
Grazie comunque.
 

Star-Dust

Expert
Licensed User
Longtime User
Se non ricordo male qualsiasi cosa non sia informazione 'vera e propria' in HTML è racchiusa tra "<" e ">".
Quindi penso si debba costruire una funzione che dopo il "<td>" cerchi il primo "<" (che non sia un "</td>") ne trovi poi il ">" e elimini il contenuto.
Questo finché non si trova un "</td>", quello che rimane è l'informazione pulita.
Applichi la funzione ad ogni cella.

Non è un informazione ma sono etichette che permettono di capire che informazioni sono e dove posizionarli, togliendo tutti i comandi diventerebbe solo una accozzaglia incomprensibile :p:p:p:p
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
calsdn intendeva, per informazioni, quello che poi sarà visualizzato sullo schermo, alla posizione e con le caratteristiche stabilite dai tag HTML.
Ad esempio : <TD>ciao</TD>
"ciao" è l'informazione.
 

calsdn

Member
Licensed User
calsdn intendeva, per informazioni, quello che poi sarà visualizzato sullo schermo, alla posizione e con le caratteristiche stabilite dai tag HTML.
Ad esempio : <TD>ciao</TD>
"ciao" è l'informazione.
confermo

tutto ciò che sta tra un "<" e un ">" sono attributi o tag Html.
 

Star-Dust

Expert
Licensed User
Longtime User
Prova una cosa così

B4X:
Sub InterpretaTabella(WWW As String)
    Dim TabellaHTML As String
    'WWW é una stringa che contiene tutto il codice della pagina HTML
    TabellaHTML=WWW.SubString(WWW.ToUpperCase.IndexOf("<TABLE"))
    TabellaHTML=TabellaHTML.SubString2(0,TabellaHTML.ToUpperCase.IndexOf("</TABLE>"))
    Dim Righe() As String = Regex.Split("</tr>",TabellaHTML)

  
    For Rg=0 To Righe.Length-1
        Dim celle() As String = Regex.Split("</td>",Righe(Rg))
        For Col=0 To celle.Length-1
            Dim Cella As String
            Cella=TogliTag(celle(Col))
            Log("Cella (" & Rg & "," & Col & ") :" & Cella)
            ' NuovaTabella(Rg,Col)=Cella
        Next
    Next
End Sub

Sub TogliTag(cella As String) As String
    Dim Ret As String =""
    Dim Tag As Boolean = False
  
    For i=0 To cella.Length-1
        If cella.SubString2(i,i+1)="<" Then Tag=True
        If Not(Tag) Then Ret=Ret & cella.SubString2(i,i+1)
        If cella.SubString2(i,i+1)=">" Then Tag=False
    Next

    Return Ret
End Sub
 
Last edited:

udg

Expert
Licensed User
Longtime User
Non credo di aver capito bene, ma loscopo è davvero avere solo "lo schema" ovvero una sequenza di tag HTML?
In tal caso RegEx è la strada più diretta e semplice.
Direi un matcher tipo:
<.*?>

udg
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Al contrario, lo scopo è avere i dati della tabella dentro una matrice
 

udg

Expert
Licensed User
Longtime User
Ok, capito. Se la tabella ha un formato fisso e noto (es. ogni TR dispone sempre di 5 TD) allora sempre con RegEx si possono estrarre i dati ed eventualmente ripulirli.
@AlpVir : riesci a postare una tabella demo?
 

Star-Dust

Expert
Licensed User
Longtime User
Ok, capito. Se la tabella ha un formato fisso e noto (es. ogni TR dispone sempre di 5 TD) allora sempre con RegEx si possono estrarre i dati ed eventualmente ripulirli.
@AlpVir : riesci a postare una tabella demo?
io ho già postato un piccolo codice che potrebbe essere adatto. Dagli un occhiata
 
  • Like
Reactions: udg

udg

Expert
Licensed User
Longtime User
io ho già postato un piccolo codice che potrebbe essere adatto.
Hai ragione, scusa. Ero accecato dall'idea di poche righe RegEx e non mi sono soffermato sulla tua risposta.
 

udg

Expert
Licensed User
Longtime User
Ho provato ad impostare una soluzione più o meno pura con RegEx.
Come primo step "decente" avrei:
(<td class="nodecBlack" colspan.*?>\n<p.*?class="nodecBlack">)(.*?<\/a>)(<\/p>\n<p.*?>)(.*?<\/p>)

Questo seleziona le 25 (su 27 celle) compilate in tabella e definisce quattro gruppi; nel gruppo 2 c'è il nome dell'insegnante e nel 4 c'è la materia.
Problemi
- quando ci sono due insegnanti separati da trattino (es. Buonadonna- Cornelio)
- le celle con dati in colore bianco (es. Cattarin / Latino)
- le celle vuote che vengono saltate del tutto

ps: è voluto che i nominativi siano seguiti da </a> e le materie da </p> che vanno eliminati con il Replace.
pps: per il problemi doppio insegnante nulla impedisce di applicare uns econdo Regex su quanto estratto come gruppo

Lascio a voi il divertimento di perfezionare la cosa, mentre io vado ad imbastire un minimo di cena..

bye
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Vi posto un piccolo codice che già funziona con la tabella da voi inviata, è lo stesso postato prima con.qualche correzione.

Ho provato su un dispositivo e funziona.

B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    Activity.Title="Orario"
  
    Web.Initialize("Web")
    Web.LoadHtml(File.ReadString(File.DirAssets,"Orario 1AL.html"))
    Activity.AddView(Web,0,0,100%x,100%y)
    InterpretaTabella(File.ReadString(File.DirAssets,"Orario 1AL.html"))
End Sub

Sub Activity_Resume
  
End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub InterpretaTabella(WWW As String)
    Dim TabellaHTML As String
    'WWW é una stringa che contiene tutto il codice della pagina HTML
    TabellaHTML=WWW.SubString(WWW.ToUpperCase.IndexOf("<TABLE"))
    TabellaHTML=TabellaHTML.SubString2(0,TabellaHTML.ToUpperCase.IndexOf("</TABLE>"))
    Dim Righe() As String = Regex.Split("</tr>",TabellaHTML)

  
    For Rg=0 To Righe.Length-1
        Dim celle() As String = Regex.Split("</td>",Righe(Rg))
        For Col=0 To celle.Length-1
            Dim Cella As String
            Cella=TogliTag(celle(Col))
            Log("Cella (" & Rg & "," & Col & ") :" & Cella)
            ' NuovaTabella(Rg,Col)=Cella
        Next
    Next
End Sub

Sub TogliTag(cella As String) As String
    Dim Ret As String =""
    Dim Tag As Boolean = False
  
    cella=cella.Replace("&nbsp;"," ")
    For i=0 To cella.Length-1
        If cella.SubString2(i,i+1)="<" Then Tag=True
        If Not(Tag) Then Ret=Ret & cella.SubString2(i,i+1)
        If cella.SubString2(i,i+1)=">" Then Tag=False
    Next

    Return Ret
End Sub
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
@Star-Dust : perfetto. Grazie
Qualche adattamento agli specifici casi che incontro ed il mio problema è risolto in modo assai compatto ed elegante.
 
Top