Autore Topic: Problema ottenimento dati da pagina web  (Letto 1079 volte)

Offline Stefano Cipriani

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    ubuntu
Problema ottenimento dati da pagina web
« il: 29 Marzo 2011, 16:38:14 CEST »
0
Ciao a tutti,
ho letto questo tutorial [http://www.anddev.it/index.php/topic,177.new.html#new]
e ho cercato di utilizzarlo per una mia applicazione.
Essa dovrebbe visualizzare gli accordi di una canzone in una TextView leggendoli dal sito www.ultimate-guitar.com

L' app è formata da due classi di cui riporto il codice:
Classe CercaTablatura:
Codice (Java): [Seleziona]
public class CercaTablatura extends Activity {
       
        //String url_str = "http://www.anddev.it/";
        String s = null;
        //Provo ad aprire l'url degli accordi(e' una pagina di esempio)
        String url_str = "http://tabs.ultimate-guitar.com/a/alex_ubago/aunque_no_te_pueda_ver_crd.htm";
    @Override
    public void onCreate(Bundle savedInstanceState) {
       
        super.onCreate(savedInstanceState);
       
        //tab_layout e' un LinearLayout che contiene una TextView
        setContentView(R.layout.tab_layout);

        TextView tv = (TextView)findViewById(R.id.myTextView);
        try {
               
                HtmlParser hp = new HtmlParser(url_str);
                s = hp.trovaTab();
                Log.d("Lunghezza stringa",""+s.length());
     
               
                /*Stampo il corpo della tablatura
                if (s == null){
                        Log.d("Tab", "Non c'è testo");
                }
                else{
            /* Se il testo è != null lo stampo nel Log. */

                Log.d("Tab", "Tab: "+s);
                }
                tv.debug(0);
                tv.setBackgroundColor(Color.WHITE);
                tv.setTextColor(Color.BLACK);
                tv.setMovementMethod(new ScrollingMovementMethod());
                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());
        }
       
    }

}

Questo invece e' il codice della seconda classe
Codice (Java): [Seleziona]
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("Errore", 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","cont" , false, true) != null){
                        i++;
                        sb.append("Tag["+i+"] " +
                                Element.findElementByAttValue("id","cont" , false, true).getText()
                                +"\n");
                        }
                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;
        }

               
}

Il metodo cercaTab dovrebbe scorrere ogni elemento della pagina e cercare al suo interno il tag che abbia attributo id di valore "cont" e copiarne
il testo in sb!
Purtroppo invece questo tag da me cercato sembra non essere presente, infatti in sb viene quasi sempre messa la stringa "Nessuna corrispondenza".
Cosa ancora più strana, ho provato a fare un progetto Java (non android) che facesse la stessa cosa e funziona perfettamente. Possiblie che la stessa istruzione 
Codice (Java): [Seleziona]
List<Object> elementi = rootNode.getAllElementsList(true); dia risultati diversi nel progetto java e in quello android?
Mi sembra assurdo!

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema ottenimento dati da pagina web
« Risposta #1 il: 29 Marzo 2011, 17:49:23 CEST »
0
TagNode e gli altri, son oggetti fatti da te, sono del dom parser oppure di qualche libreria esterna?
In ogni caso, sia su java che su android utilizzi la stessa IDENTICA libreria?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Stefano Cipriani

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    ubuntu
Re:Problema ottenimento dati da pagina web
« Risposta #2 il: 29 Marzo 2011, 18:14:51 CEST »
0
Gli oggetti fanno parte della libreria esterna HtmlCleaner (versione 2.2) (HtmlCleaner Project Home Page).
Sono sicuro che sia la stessa, perchè vedendo che non funzionava come mi aspettavo, ho deciso di fare la prova all'esterno del progetto android.

Offline Stefano Cipriani

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    ubuntu
Re:Problema ottenimento dati da pagina web
« Risposta #3 il: 30 Marzo 2011, 07:46:30 CEST »
0
A quanto pare il problema è proprio nella linea
Codice (Java): [Seleziona]
List<Object> elementi = rootNode.getAllElementsList(true);Facendo il debug, nella versione per android ho notato che la lunghezza della lista è 74,
mentre nella versione java(con codice in allegato) la stessa lista contiene 436 elementi!
Codice (Java): [Seleziona]
package parser;

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;

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("href").toString()+"\n");
               
               
            }
           
            return sb.toString();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
       
        return null;
    }

        public static void main(String[] args){
                String url_str = "http://tabs.ultimate-guitar.com/a/alex_ubago/aunque_no_te_pueda_ver_crd.htm";
                //String url_str = "http://anddev.it";
                StringBuffer sb = new StringBuffer();
               
                try {
               
                HtmlParser hp = new HtmlParser(url_str);
                List<Object> elementi = hp.rootNode.getAllElementsList(true);
                int i=0;
               
                for (Iterator<Object> iterator = elementi.iterator(); iterator.hasNext();)
            {
                       
                TagNode Element = (TagNode) iterator.next();
                /*
                if(Element.findElementByName("body", true) != null){
                        i++;
                        sb.append("Tag["+i+"] " +
                        Element.findElementByName("body",true).getText()
                        +"\n");
                }
                else sb.append("Nessuna corrispondenza\n");
              */
      
             
                // if(Element.findElementHavingAttribute("id", false) != null
                //              && Element.findElementHavingAttribute("id", false).getName().compareTo("div") == 0){
                        if(Element.findElementByAttValue("id","cont" , false, true) != null){
                                i++;
                                sb.append("Tag["+i+"] " +
                                                Element.findElementByAttValue("id","cont" , false, true).getText()
                                                +"\n");
                        }
               // }
               
            }
                //sb = hp.Stampa("div");
                System.out.print(sb.toString());
           
         
               
             
        } catch (Exception e) {
             /* In caso di errore, stampiamo un messaggio */
                e.printStackTrace();
             System.err.println("Impossibile parsare il file");
        }
       
        }
}
Come mai molti elementi della pagina vengono ignorati?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema ottenimento dati da pagina web
« Risposta #4 il: 30 Marzo 2011, 09:06:30 CEST »
0
Scusa, se utilizzi l'esempio Example: Traverse DOM tree che riporta la home di HtmlCleaner, ottieni gli stessi risultati?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Stefano Cipriani

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    ubuntu
Re:Problema ottenimento dati da pagina web
« Risposta #5 il: 30 Marzo 2011, 21:42:22 CEST »
0
Ho provato il codice ma il risultato è identico, così ho deciso di leggere il contenuto della pagina un byte alla volta, con il codice di seguito,
ancora ottengo due comportamenti diversi.
Codice (Java): [Seleziona]
if(args.length > 0){
                        try {
                                String url = "http://tabs.ultimate-guitar.com/a/alex_ubago/aunque_no_te_pueda_ver_crd.htm";
                                URL u = new URL (url);
                                InputStream in = u.openStream();
                                in = new BufferedInputStream(in);
                                Reader r = new InputStreamReader(in);
                                int c;
                                while((c = r.read()) != -1){
                                        System.out.print((char)c);                             
                                }                      
                        }              
                        catch(MalformedURLException e){
                                System.err.println("Not parsable URL");                
                        }
                        catch(IOException e){
                                System.err.println(e);                 
                        }
                }
In effetti sembra che la pagina venga "tagliata", perciò la libreria esterna funziona bene...non so, forse è un problema della macchina virtuale android...
 

Offline Stefano Cipriani

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    ubuntu
Re:Problema ottenimento dati da pagina web
« Risposta #6 il: 31 Marzo 2011, 00:56:33 CEST »
0
Alla fine ho risolto.
L' errore non dipendeva nè da librerie nè dalla macchina virtuale, ma piuttosto da me :-P
Aprendo il link in un browser normale si va direttamente alla pagina della tab,
invece aprendolo su un dispositvo android si viene prima reindirizzati su una pagina pubblicitaria e da lì c'è un link alla pagina degli accordi.
ecco perchè i risultati della lista elementi erano (giustamente)diversi!
 

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema ottenimento dati da pagina web
« Risposta #7 il: 31 Marzo 2011, 09:43:14 CEST »
0
^_^
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/