Autore Topic: Parsing html con htmlcleaner  (Letto 1057 volte)

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Parsing html con htmlcleaner
« il: 29 Aprile 2012, 11:41:45 CEST »
0
Ciao a tutti ragazzi,sono ai primi passi con programmazione android.
Sto cercando di realizzare il parsing di una mia pagina html dove ho dei dati meteorologici  ed è cosi strutturara:
<div id="ciccio">10</div>
<div id="ciccio">25</div>
<div id="ciccio">32</div>
<div id="ciccio">11</div>
......
......
La classe è sempre la stessa cioè "dato",quello che vorrei fare è prendere questi dati e con un ciclo for leggerne solo alcuni,per esempio il 1°,il 3° ecc.
Sto provando con una libreria che si chiama HtmlCleaner ma non riesco a capire dove sbaglio.Allego il codice:

Classe HtmlPArser.java

Codice: [Seleziona]
package edges.android.htmlparser;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

import android.util.Log;

public class HtmlParser {
       
        // oggetto TagNode radice del file html
        private TagNode rootNode;
        private String url_str = null;
       
        public HtmlParser(String url_str)
        {
                //URL di cui si vuole fare il parsing
                this.url_str = url_str;
               
                // inizializzazione dell'oggetto HtmlCleaner utile a generare un html pulito
                HtmlCleaner cleaner = new HtmlCleaner();
                CleanerProperties props = cleaner.getProperties();
                props.setAllowHtmlInsideAttributes(true);
                props.setAllowMultiWordAttributes(true);
                props.setRecognizeUnicodeChars(true);
                props.setOmitComments(true);
                 
                // apertura della connessione
                URL url;
                try {
                       
                        url = new URL(url_str);
                        URLConnection conn = url.openConnection();
                       
                        //ora utilizziamo l'oggetto cleaner per "ripulire" l'html e inizializzare l'oggetto rootNode
                        rootNode = cleaner.clean(new InputStreamReader(conn.getInputStream()));
                       
                       
                } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        Log.e("Error", e.getMessage());
                       
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        Log.e("Error", e.getMessage());
                }
        }
       
       
        List<Object> getElement(String elementName)
    {
        List<Object> elementList = new ArrayList<Object>();

        TagNode Elements[] = rootNode.getElementsByName(elementName, true);
        for (int i = 0; Elements != null && i < Elements.length; i++)
        {

            String type = Elements[i].getAttributeByName("id");
            if ( type != null )
            {
                elementList.add(Elements[i]);
            }

        }

        return elementList;
    }
       
        public String Stampa(String elementName)
    {
            StringBuffer sb = new StringBuffer();
           
        try
        {
           
            List<Object> elementi = this.getElement(elementName);

            sb.append(">>> Stampa contenuto degli elementi '"+elementName+"' per il sito '"+url_str+"'\n");
            for (Iterator<Object> iterator = elementi.iterator(); iterator.hasNext();)
            {
                TagNode Element = (TagNode) iterator.next();
               
                sb.append("Link: " + Element.getAttributeByName("id").toString()+"\n");
               
               
            }
           
            return sb.toString();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
       
        return null;
    }

       
}

Classe Finestra.java

Codice: [Seleziona]
package edges.android.htmlparser;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Finestra extends Activity {
       
        String elementName = "div";
        String url_str = "http://www.meteocecchina.it/parser.htm";
       

    @Override
    public void onCreate(Bundle savedInstanceState) {
       
            super.onCreate(savedInstanceState);
       
            setContentView(R.layout.main);
        TextView tv = new TextView(this);
       
        try {
               
                HtmlParser hp = new HtmlParser(url_str);

            /* passiamo il risultato alla TextView per visualizzarli. */
            tv.setText(hp.Stampa(elementName));
               
             
        } catch (Exception e) {
             /* In caso di errore, passiamo l'errore alla TextView. */
             tv.setText("Problema nel parsing: \n" + e.getMessage());
             Log.e("Error", e.toString());
        }
       
        /* Carichiamo il contenuto della TextView all'interno della View dell'Activity. */
        this.setContentView(tv);
    }

}



Il file parser.htm che contiene dati meteo che vado a parsare per prova è cosi fatto

<div id="ciccio">10</div>
<div id="ciccio">1024</div>
......
......

L'output del codice java che ho scritto sopra è il seguente:

Link: ciccio
Link: ciccio
Link: ciccio
Link: ciccio
Link: ciccio
Link: ciccio
............
e cosi via ovviaamente fino a tutti i div  che ci sono con l'id ciccio.

In questo modo quindi mi prende solo il valore dell'id del div mentre io vorrei prendesse il valore che è contenuto nel div!
Qualcuno ha qualche idea?grazie ragazzi :-)

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:Parsing html con htmlcleaner
« Risposta #1 il: 29 Aprile 2012, 12:24:57 CEST »
0
Hai provato con getElementsByAttValue o getElementsHavingAttribute ? l'attributo è ciccio e con questi altri due metodi dovresti ricavarti gli elementi sapendo l'attributo.
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Parsing html con htmlcleaner
« Risposta #2 il: 29 Aprile 2012, 13:12:13 CEST »
0
No mi cambia la sintassi da utilizzare,ma a quel punto non so cosa mettere

The method getElementsByAttValue(String, String, boolean, boolean) in the type TagNode is not applicable for the arguments (String)

Ed io ho

Codice: [Seleziona]
TagNode Elements[] = rootNode.getElementsByName(elementName, true);

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Parsing html con htmlcleaner
« Risposta #3 il: 30 Aprile 2012, 22:03:47 CEST »
0
Ragazzi nessuno che mi aiuti? :-X

Offline bombolo88

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung next
Re:Parsing html con htmlcleaner
« Risposta #4 il: 30 Aprile 2012, 23:46:54 CEST »
0
Ragazzi ci sono quasi,sto utilizzando questo codice:

Codice: [Seleziona]
package edges.android.htmlparser;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

import android.util.Log;

public class HtmlParser {
       
        // oggetto TagNode radice del file html
        private TagNode rootNode;
        private String url_str = null;
        public StringBuffer sb = new StringBuffer();
       
        public HtmlParser(String url_str)
        {
                //URL di cui si vuole fare il parsing
                this.url_str = url_str;
               
                // inizializzazione dell'oggetto HtmlCleaner utile a generare un html pulito
                HtmlCleaner cleaner = new HtmlCleaner();
                CleanerProperties props = cleaner.getProperties();
                props.setAllowHtmlInsideAttributes(true);
                props.setAllowMultiWordAttributes(true);
                props.setRecognizeUnicodeChars(true);
                props.setOmitComments(true);
                 
                // apertura della connessione
                URL url;
                try {
                       
                        url = new URL(url_str);
                        URLConnection conn = url.openConnection();
                       
                        //ora utilizziamo l'oggetto cleaner per "ripulire" l'html e inizializzare l'oggetto rootNode
                        rootNode = cleaner.clean(new InputStreamReader(conn.getInputStream()));
                       
                       
                } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        Log.e("Error", e.getMessage());
                       
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        Log.e("Error", e.getMessage());
                }
        }
       
       
        public String trovaTab(){
       
        try {
       

        //Ottengo una lista di tutti gli elementi della pagina
        List<Object> elementi = rootNode.getAllElementsList(true);
       

       
        int i=0;
        for (Iterator<Object> iterator = elementi.iterator(); iterator.hasNext();)
    {

        TagNode Element = (TagNode) iterator.next();
       
        //Gli accordi della canzone sono contenuti in <div id="cont">
        if(Element.findElementByAttValue("id","ciccio" , false, true) != null){
               
                sb.append("Tag["+i+"] " +
                        Element.findElementByAttValue("id","ciccio" , false, true).getText()
                        +"\n");
                i++;
                }
        else{
                sb.append("Nessuna corrispondenza\n"); 
                }
       
    }
        return sb.toString();
     
} catch (Exception e) {
     /* In caso di errore, stampiamo un messaggio */
        e.printStackTrace();
     //System.err.println("Impossibile parsare il file");
}
return null;
}

     

       
}


e poi questo

Codice: [Seleziona]
package edges.android.htmlparser;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Finestra extends Activity {
       
        String s = null;
        //String elementName = "div";
        String url_str = "http://www.meteocecchina.it/abc.htm";
       

    @Override
    public void onCreate(Bundle savedInstanceState) {
       
            super.onCreate(savedInstanceState);
       
            setContentView(R.layout.main);
        TextView tv = new TextView(this);
       
        try {
               
                HtmlParser hp = new HtmlParser(url_str);
                s = hp.trovaTab();
            /* passiamo il risultato alla TextView per visualizzarli. */
                tv.setText(s);
               
             
        } catch (Exception e) {
             /* In caso di errore, passiamo l'errore alla TextView. */
             tv.setText("Problema nel parsing: \n" + e.getMessage());
             Log.e("Error", e.toString());
        }
       
        /* Carichiamo il contenuto della TextView all'interno della View dell'Activity. */
        this.setContentView(tv);
    }

}




Mentre questo è il contenuto del file htm di prova di cui voglio fare il parsing


<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>
<div id="ciccio">10</div>

Mentre in allegato c'è l'output dell'app nell AVD
« Ultima modifica: 30 Aprile 2012, 23:48:27 CEST da bombolo88 »