Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    DOM:scansionare i nodi per modificare il testo tra TAG

    Ciao a tutti!
    Dovrei automatizzare un procedimento abbastanza noioso di trasformazione del testo (di un file html) compreso tra i vari tag, per una specie di newsletter.
    Premetto che ho trovato tonnellate di guide per scansionare semplicemente l'alberatura dei vari nodi e sottonodi, ed estrapolarne i dati, tutt'al più modificare gli attributi dei vari tag,
    ed inoltre qualche metodo che lavora sugli XML mi ha dato problemi sul parsing in quanto l'html che devo trasformare a volte non è well-formed.

    Io devo praticamente analizzare e formattare TUTTO il testo "normale" compreso tra due tag:
    es1:
    codice:
     <div>TESTO<div>
    es2:
    codice:
         <div>TESTO
                <table>
                      <tr>una colonna
                           <td>una riga</td>
                           <td>due righe</td>
                      </tr>
                </table>
          </div>
    dovrei analizzare nell'es1 solo TESTO, e nell'es2 "TESTO", "una colonna","una riga","due righe"
    e all'occorrenza dovrei anche modificare questi testi, per esempio sostituire i caratteri speciali come '&" èà ecc.ecc.. ma devo farci anche altre 2-3 cose lunghe da spiegare, e già risolte con un paio di funzioncine sulle stringhe.

    Visto che l'html può avere infiniti nodi children, dovrei scrivere un metodo ricorsivo o comunque ciclico che, per ogni nodo, controlla il suo testo e poi passa ai figli e tutti i "discendenti" ...
    Io ho cominciato a prendere riga per riga di un file html, cercare "<" e se lo trovo cerco ">",
    faccio una substring dall'indice del primo al secondo e ignoro cioò che c'è all'interno.

    Il problema è che nel testo html potrebbero esserci <> (da cambiare con &lt; &gt, quindi non necessariamente tag html.
    un altro problema nasce dal seguente caso
    codice:
     <td width="471" style="color:#1e86bd; font-family:Verdana,Arial,Helvetica,sans-serif;
    font-size:12px; line-height:16px;">
    visto che sto operando riga per riga, non trovando la chiusura tag la funzione che sto facendo potrebbe interpretare come testo normale ciò che invece non deve toccare.

    Potrei ovviare mettendo un flag es.isTagEnded e controllare che al rigo successivo ci sia ">"
    ma la cosa è un po elaborata e poco elegante...

    Qualche libreria di cui ho letto permette di esplorare l'alberatura , di estrapolare tutto il testo normale, ma come modificarlo in modo dinamico non mi è sembrato di trovarne nessuno...
    Poi ho un altro dubbio:
    se pure trovassi qualche libreria ed avessi una alberatura come l'es2
    partendo dal nodo più "alto" (div) dovrei modificare solo TESTO,poi scendendo in TABLE non trovo nulla e vado avanti con
    <td>una riga</td> e processo "una riga"(es cambio in "1 riga")
    vado avandi con
    <td>due righe</td>e processo "due righe"(es cambio in "2 righe")
    il dubbio è : non è che quando parte da <div> considera come testo anche tutti gli altri tag tipo <TABLE>???

    Qualcuno mi riesce a consigliare qualche libreria valida per scansionare e modificare dinamicamente il testo contenuto dei nodi senza intaccare i tag?
    "

  2. #2
    Nella stesura di alcuni spider mi sono inbattuto in questa libreria non ho mai avuto problemi.

  3. #3
    Mitico che velocità!
    sto guardando le API e questo NodeIterator abbinato a TextNode sembra quello che fa per me...
    Però vedo solo il metodo nextNode(), e creare un oggetto Node che lo contiene non sembra darmi i risultati sperati...insomma mi escono varie cose tipo classpath...ora devo staccare un attimo per forza superiore...tra un paio di orette ti saprò scrivere meglio cosa ottengo...

    Cmq per ora ti ringrazio tantissimo!
    "

  4. #4
    Se guardi nella documentazione mi pare che puoi castare i node del NodeIterator a qualsiasi oggetto essi rappresentino es. Div o Table ecc questi oggetti hanno al loro interno metodi che ti restituiscono il testo contenuto, l'html o i nodi figli ecc ecc. E' una bella libreria, in oltre puoi impostare tutta una serie di filtri per ritornare solo i tag che ti interessano....
    Es. Dammi tutti i tag TD che contengono l'attributo with=50
    Oppure: dammi tutti i tag con name=pippo o con id=pippo2

    E'un po come l'xml dom solamente fatto apposta per l'html.

  5. #5
    In realtà non devo fare nessuna discriminante di tag...devo semplicemente prenderli tutti, figli compresi , e formattare il testo compreso tra ogni tag.
    E' possibile o devo fare uno switch case chilometrico ?
    "

  6. #6
    Penso di no, poichè tutti i tipi di nodo Table,TR,DIV ecc ecc. implementano tutti la stessa classe che di base ha diversi metodi per recuperare roba, speriamo che ci sia quello che serve a te

  7. #7
    Beh...jar molto utile, devo ammettere che mi è servito a salvarmi in un altro file la porzione che interessa a me... effettivamente ho dimenticato di specificare che devo salvare solo una table html in un altro file e poi lavorarci, quindi il parser non vedendo un vero e proprio documento html "intero" non trova più nodi...l'unica cosa che è davvero potente è

    codice:
              Parser parser = new Parser (path");
    	            NodeList nlist = new NodeList ();
    	            NodeFilter filter = new TagNameFilter ("TABLE");
    	            for (NodeIterator e = parser.elements(); e.hasMoreNodes ();){
    	                e.nextNode().collectInto (nlist, filter);
    	            }
    Giunto a questo punto, potrei farmi una scansione e salvataggio di tutti i tag che vengono trovati, ma ripeto, se vede solo la table è come se non considerasse il documento come un html...

    Ma poi non capisco, il NodeList che dovrebbe contenere tutti i nodi "figli", ne ha anche un indirizzamento per riferimento così da poterne modificare il contenuto?
    Cmq mi sa che dovrei trattare a questo punto il documento conentente solo la table, come XML anche se i tag contengono attributi (es <font style="font-size:14px;">) invece ce i classici e "snelli" <TAG></TAG> dell'xml...
    "

  8. #8
    ti dovrebbe vedere le table e tutti i suoi figli.....
    Puoi scorrere tutte le righe e le colonne della tabella a tuo piacimento.

    esempio
    codice:
    Parser parser = Parser.createParser(tuoHtml, null);
    NodeList list;
    list = parser.extractAllNodesThatMatch(new AndFilter(new HasAttributeFilter("CLASS"),new TagNameFilter("TR")));
    SimpleNodeIterator iter = list.elements();
     while(iter.hasMoreNodes()){
        	        	Node node = iter.nextNode();
        	        	
        	        	if(node instanceof TableRow){
        	        		TableRow row = (TableRow) node;
                                    .....tue operazioni
                              }
      }
    Questo frammento di codice l'ho usato per recuperare tutti i tr di una tabella, ma nulla ti vieta di adattarlo alle tue esigenze, dovrai usare la classe TableTag che contiene getRows() che ritorna un array di TableRow.

  9. #9
    Ciao!
    Per ora ho risolto una parte del problema, ho salvato il "nodo" che interessa a me in un secondo file html e ora dovrei processare nodo per nodo, sottonodo per sottonodo, cioè trattare il file .html come un xml... solo che ora ho un altro problema...sto usando jdom per farlo, ma dato il codice
    codice:
    		Document documento = null;
    		SAXBuilder saxBuilder = new SAXBuilder();
    		try{
    		documento = saxBuilder.build(new File(path));
    		}
    		catch (JDOMException ex)
    		{
    		System.err.println(ex);
    		}
    		catch (IOException ex)
    		{
    		System.err.println(ex);
    		}
    questo mi da

    com.sun.org.apache.xerces.internal.impl.io.Malform edByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.

    In pratica se ho ben capito cerca di leggere il file con il charset utf ma a me è iso.
    Esiste un sistema per ignorare il charset o settarmelo manualmente?
    "

  10. #10
    nell'xml lo standard è utf-8, credo che devi cambiare il charset quando lo scrivi nel file.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.