Autore Topic: [medio] Parsing html tramite Jsoup e visualizzazione in listview  (Letto 9566 volte)

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
+1
Livello di difficoltà: medio
Target SDK: 17
Min SDK: 8
Link al file compresso del progetto eclipse: https://docs.google.com/file/d/0B3hWbaY6fk3mcmdVRVl2ejF4Rms/edit?usp=sharing[/url] (su google drive perchè la dimensione massima sul forum è 1MB, e il file pesa 1.43))

Date le molte richieste sul forum e i molti post aperti su questo argomento, ho deciso di scrivere un tutorial sul parsing di una pagina web tramite la libreria Jsoup ( http://jsoup.org/ ) e la successiva visualizzazione dei dati in una listview.
Come esempio ho deciso di prendere la home di anddev.it, e di visualizzare le varie sezioni del forum nella listview.
Il codice è tutto commentato, ma in caso di bisogno chiedete pure.

Risultato finale
Vedi immagine in allegato

Tutorial
Iniziamo: per prima cosa colleghiamoci al sito di Jsoup riportato sopra e scarichiamo l'ultima versione in formato .jar (alla scrittura del tutorial la 1.7.2).
Una volta fatto ciò, lo importiamo in eclipse nella cartella libs del nostro progetto, in modo che venga automaticamente incluso nella build del progetto.

Il codice:

MainActivity (con asynctask che viene eseguito):
Codice (Java): [Seleziona]
package it.rs.esempioparsinglistview;

import java.io.IOException;
import java.util.ArrayList;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

        ListView lista;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                lista = (ListView)this.findViewById(R.id.main_lista);//recupero lista da id
               
                //creo ed eseguo l'asynctask
                ParsingPaginaWeb parsing = new ParsingPaginaWeb();
                parsing.execute("");
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        private class ParsingPaginaWeb extends AsyncTask<String,String,String> {

                ArrayList<String> titoli; //lista dei titoli
                ArrayList<String> descrizioni; //lista delle descrizioni
               
                @Override
                protected void onPreExecute()
                {
                        //prima di eseguire il parsing inizializzo gli arraylist
                        titoli = new ArrayList<String>();
                        descrizioni = new ArrayList<String>();
                }
               
                @Override
                protected String doInBackground(String... params) {
                        /*
                         * Qui si effettua il parsing. Come esempio prendiamo il sito di anddev.it
                         * Questo, lo ripeto, è solo un esempio, in quanto il parsing cambia
                         * completamente in base al sito da cui prendere i dati.
                         *
                         *
                         * In questo caso vogliamo prendere dalla home di anddev.it i titoli
                         * delle varie sezioni del forum e la relativa descrizione.
                         * Quindi analizzando un po il codice html notiamo che:
                         *
                         * 1- La home è organizzata in tabella con classe "table_list"
                         *
                         * 2- All'interno c'è una alternanza di tbody con classe header e content.
                         *    A noi interessano quelli con classe content
                         *  
                         * 3- All'interno di ogni tbody con classe "content" ci interessa ogni riga con
                         *    classe "windowbg2", che contengono i dati da recuperare
                         *
                         * 4- All'interno di ogni riga ci interessa il testo contenuto nel tag <a> con
                         *    classe "subject" che contiene il titolo e quello nel tag <p>
                         *    che contiene la descrizione.
                         *    
                         * Adesso abbiamo tutte le informazioni che ci servono per fare il parsing
                         */

                        try {
                                // NB: controllate di importare le classi giuste
                                // all'inizio ci deve essere org.jsoup
                               
                                // ricavo l'html della pagina con user agent desktop (Chrome)
                                // e timeout 30000
                                Document doc = Jsoup.connect("[url]http://www.anddev.it")
                                                .userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
                                                .timeout(30000).get();
                               
                                // prendo la tabella
                                // (con .first() ottengo il primo elemento, in questo caso l'unico )
                                Element tabella = doc.getElementsByClass("table_list").first();
                               
                                // prendo gli elementi che mi interessano dalla tabella
                                Elements sezioni = tabella.getElementsByClass("content");
                                for(Element sezione : sezioni)//per ogni sezione tra gli elementi ricavati prima
                                {
                                        //ricavo ogni riga nella sezione
                                        Elements righe_sezione = sezione.getElementsByClass("windowbg2");                                      
                                        for(Element riga : righe_sezione)
                                        {
                                                //prelevo la cella delle info
                                                Element info = riga.getElementsByClass("info").first();
                                               
                                                // ricavo il titolo
                                                // (con .text() ottengo il testo non formattato
                                                String titolo = info.getElementsByClass("subject").first().text();
                                               
                                                // ricavo la descrizione
                                                // (uso .first() per essere sicuro che sia proprio la descrizione
                                                // e non i moderatori )
                                                String descrizione = info.getElementsByTag("p").first().text();
                                               
                                                // inserisco nei rispettivi arraylist
                                                titoli.add(titolo);
                                                descrizioni.add(descrizione);
                                        }
                                }
                        } catch (Exception e) {
                                // gestione dell'eccezione
                                // ad esempio mostrare messaggio di errore o altro (qui nel logcat)
                                Log.e("ESEMPIO", "ERRORE NEL PARSING");
                        }
                        return null;
                }
               
                @Override
                protected void onPostExecute(String result)
                {
                        // dopo che ho eseguito il parsing mostro i dati nella listview
                        // usando il custom array adpater ParsingArrayAdapter
                       
                        ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli, descrizioni);
                        lista.setAdapter(adapter);
                }
               
        }

}


ParsingArrayAdapter:
Codice (Java): [Seleziona]
package it.rs.esempioparsinglistview;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ParsingArrayAdapter extends ArrayAdapter<String>{

        //riferimenti statici alle risorse e agli id
        private final static int LAYOUT = R.layout.riga_listview;
        private final static int TITOLO = R.id.riga_listview_titolo;
        private final static int DESCRIZIONE = R.id.riga_listview_descrizione;
       
        ArrayList<String> titoli; //lista dei titoli
        ArrayList<String> descrizioni; //lista delle descrizioni
       
        Context c; //context
        LayoutInflater inflater; //layout inflater
       
        public ParsingArrayAdapter(Context context,ArrayList<String> titoli,ArrayList<String> descrizioni)
        {
                super(context,TITOLO);
                this.c = context;
                this.titoli = titoli;
                this.descrizioni = descrizioni;
                this.inflater = LayoutInflater.from(c);
        }
       
        @Override
        public int getCount()
        {
                return titoli.size(); //ritorno lunghezza lista ( = numero dei titoli)
        }
       
        //quando la lista richiede una view
        @Override
        public View getView(int pos,View view,ViewGroup parent)
        {
                CacheRiga cache; //cache
                if(view==null)//se è la prima volta che viene richiesta la view
                {
                        // creo la view ma non l'attacco alla lista in quanto devo ancora modificare
                        // i testi delle textview
                        view = inflater.inflate(LAYOUT, parent,false);
                        cache = new CacheRiga(); //inizializzo la cache
                        cache.titolo = (TextView) view.findViewById(TITOLO); //collego titolo
                        cache.descrizione = (TextView) view.findViewById(DESCRIZIONE);//collego descrizione
                        view.setTag(cache);//collego view con cache
                }
                else
                {
                        cache = (CacheRiga) view.getTag(); //altrimenti prendo la cache dalla view
                }
               
                cache.titolo.setText(titoli.get(pos)); //imposto il titolo
                cache.descrizione.setText(descrizioni.get(pos)); // e la descrizione
               
                return view;
        }
       
        private class CacheRiga { // classe per la cache delle righe
                public TextView titolo; // cache titolo
                public TextView descrizione; // cache descrizione
        }
       
}


Xml dei layout:

activity_main.xml

Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

    <ListView
       android:id="@+id/main_lista"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1" >
    </ListView>

</LinearLayout>

riga_listview
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <TextView
       android:id="@+id/riga_listview_titolo"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Medium Text"
       android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
       android:id="@+id/riga_listview_descrizione"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Small Text"
       android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

Bibliografia:
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #1 il: 29 Aprile 2013, 09:38:17 CEST »
0
Grazie per il tutorial, sicuramente tornerà utile a molti.
Solo una cosa: come mai hai usato due ArrayList paralleli (titoli e descrizioni) invece di creare una classe "sezione" con dentro due campi "titolo" e "descrizione" e fare un solo array?

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #2 il: 29 Aprile 2013, 13:07:15 CEST »
0
Grazie per il tutorial, sicuramente tornerà utile a molti.
Solo una cosa: come mai hai usato due ArrayList paralleli (titoli e descrizioni) invece di creare una classe "sezione" con dentro due campi "titolo" e "descrizione" e fare un solo array?

In realtà non ci avevo pensato..... So programmare in java e per android, ad un livello medio, diciamo che mi mancano tutti quelli accorgimenti per la leggibilità e performance del codice... Come questo :) grazie mille :)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #3 il: 29 Aprile 2013, 13:52:57 CEST »
0
In realtà non ci avevo pensato..... So programmare in java e per android, ad un livello medio, diciamo che mi mancano tutti quelli accorgimenti per la leggibilità e performance del codice... Come questo :) grazie mille :)

Se hai tempo e voglia potresti migliorare il tutorial :)

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #4 il: 29 Aprile 2013, 20:14:58 CEST »
0
Ciao finalmente sono riuscito a trovare un tutoria su ciò che cercavo da tempo,però purtroppo ho seguito il tutorial ma quando lacio l'emulatore l'app va in crash
questo è il logcat che mi da eclisse


Codice: [Seleziona]
04-29 20:12:32.373: E/AndroidRuntime(261): FATAL EXCEPTION: main
04-29 20:12:32.373: E/AndroidRuntime(261): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{pervasive.com.tutorialsitoparsing/it.rs.esempioparsinglistview.MainActivity}: java.lang.ClassNotFoundException: it.rs.esempioparsinglistview.MainActivity in loader dalvik.system.PathClassLoader[/data/app/pervasive.com.tutorialsitoparsing-1.apk]
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.os.Handler.dispatchMessage(Handler.java:99)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.os.Looper.loop(Looper.java:123)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.ActivityThread.main(ActivityThread.java:4627)
04-29 20:12:32.373: E/AndroidRuntime(261):         at java.lang.reflect.Method.invokeNative(Native Method)
04-29 20:12:32.373: E/AndroidRuntime(261):         at java.lang.reflect.Method.invoke(Method.java:521)
04-29 20:12:32.373: E/AndroidRuntime(261):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-29 20:12:32.373: E/AndroidRuntime(261):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-29 20:12:32.373: E/AndroidRuntime(261):         at dalvik.system.NativeStart.main(Native Method)
04-29 20:12:32.373: E/AndroidRuntime(261): Caused by: java.lang.ClassNotFoundException: it.rs.esempioparsinglistview.MainActivity in loader dalvik.system.PathClassLoader[/data/app/pervasive.com.tutorialsitoparsing-1.apk]
04-29 20:12:32.373: E/AndroidRuntime(261):         at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
04-29 20:12:32.373: E/AndroidRuntime(261):         at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
04-29 20:12:32.373: E/AndroidRuntime(261):         at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
04-29 20:12:32.373: E/AndroidRuntime(261):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
04-29 20:12:32.373: E/AndroidRuntime(261):         ... 11 more

Perpiacere qualcuno può aiutarmi a capire l'errore?

Post unito: 01 Maggio 2013, 02:42:44 CEST
Lìho provato sullo smartphone e funge  ;-)
« Ultima modifica: 01 Maggio 2013, 02:42:44 CEST da moskino11, Reason: Merged DoublePost »

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #5 il: 05 Settembre 2013, 00:32:13 CEST »
0
io compilo e testo l'app e mi crasha non capisco il perchè?
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #6 il: 05 Settembre 2013, 10:21:20 CEST »
+1
Bel tutorial.
Alcuni consigli oltre a quello che ti è stato già dato da Ricky.


MainActivity (con asynctask che viene eseguito):
Codice (Java): [Seleziona]
package it.rs.esempioparsinglistview;

        private class ParsingPaginaWeb extends AsyncTask<String,String,String> {

               
                @Override
                protected void onPostExecute(String result)
                {
                        // dopo che ho eseguito il parsing mostro i dati nella listview
                        // usando il custom array adpater ParsingArrayAdapter
                       
                        ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli, descrizioni);
                        lista.setAdapter(adapter);
                }
        }
}

Nell'AsyncTask sarebbe opportuno verificare se lista è !=null.
Mentre viene eseguito l'asynctask, la tua Activity potrebbe "non esistere" più.

Xml dei layout:

activity_main.xml

Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

    <ListView
       android:id="@+id/main_lista"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1" >
    </ListView>

</LinearLayout>


Non usare mai  android:layout_height="wrap_content" su una ListView.
Puoi provarlo in debug.
Usando wrap_content come altezza, la lista deve conoscere quanto spazio occupano i vari item della lista, e quindi deve ripercorrere spesso il metodo getView() dell'Adapter che viene chiamato molte volte (non è possibile prevedere quante...).

Questa informazione la puoi trovare in un documento di Romain Guy e Adam Powell (Googlers) dell Google I/O del 2010 (nella sezione Don’t!).

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #7 il: 26 Settembre 2013, 11:47:11 CEST »
0
Hola gente, allora, il tutorial l'ho seguito e ho scaricato l'esempio. Ho voluto dunque partire da quell'esempio per creare un altro parsing di un'altra pagina e più precisamente quella principale del forum di androidiani..  Ci sono delle cose che ancora non mi sono chiare:

1) Come posso trovare e capire quali elementi mi servono? Come posso capire se mi serve una classe o un'altra?O un id?o un tag?

2) Chiaramente dovevo cambiare per primo l'URL e poi le classi. Ebbene seguendo pari pari le istruzioni non mi riusciva. Ho provato in tutti i modi fin quando ho provato a cambiare alcune cosette.

Questo è il codice:

Codice (Java): [Seleziona]
public static void main(String[] args) throws Exception {
try {
   
    // ricavo l'html della pagina con user agent desktop (Chrome)
    // e timeout 30000
    Document doc = Jsoup.connect("http://www.androidiani.com/forum")
        .userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
        .timeout(30000).get();

    // prendo la tabella
    // (con .first() ottengo il primo elemento, in questo caso l'unico )
    Element tabella = doc.getElementById("forums");

    // prendo gli elementi che mi interessano dalla tabella
    Elements sezioni = tabella.select(".foruminfo.td");
    for(Element sezione : sezioni)//per ogni sezione tra gli elementi ricavati prima
    {
        //ricavo ogni riga nella sezione
        Elements righe_sezione = sezione.getElementsByClass("foruminfo");
        for(Element riga : righe_sezione)
        {
            //prelevo la cella delle info
            Element info = riga.getElementsByClass("datacontainer").first();

            // ricavo il titolo
            // (con .text() ottengo il testo non formattato
            String titolo = info.getElementsByClass("forumtitle").first().text();

            // ricavo la descrizione
            // (uso .first() per essere sicuro che sia proprio la descrizione
            // e non i moderatori )
            String descrizione = info.getElementsByTag("p").first().text();

            // inserisco nei rispettivi arraylist

           titoli.add(titolo);
           descrizioni.add(descrizione);
        }
    }
} catch (Exception e) {
    // gestione dell'eccezione
    // ad esempio mostrare messaggio di errore o altro (qui nel logcat)
    e.printStackTrace();
}
}

Ma perchè ho dovuto ad esempio mettere
Codice (Java): [Seleziona]
Element tabella = doc.getElementById("forums"); e non la classe corrispondente? e perchè la classe sucessiva ovvero
Codice (Java): [Seleziona]
Elements sezioni = tabella.select(".foruminfo.td"); ho dovuto metterci il "." davanti a tutto e nelle altre classi no? Non capisco queste cose. Fatemi ad esempio capire partendo da questa pagina Android o  google.it o qualsiasi altro blog, cosa devo "prendere" di preciso? anche solo stackoverflow.com.. Ho provato veramente pari pari a quello che ho fatto con il forum di androidiani ma nulla da fare. Sempre activity bianca e vuota. Grazie

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #8 il: 26 Settembre 2013, 17:49:59 CEST »
0
Devi "prendere", guardando il codice html, quel qualcosa (id o classe) che ti riesca a dare l'elemento che desideri.

Da una prima occhiata al codice html del forum di andoidiani ho notato che ogni "linea" rappresentante una sottocategoria del forum ha classe forumbit_post

Dopo che hai ottenuto tutti gli elementi con classe forumbit_post, puoi per ognuno di questi prenderti il titolo del forum, il numero delle discussioni, ecc...
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #9 il: 26 Settembre 2013, 22:05:50 CEST »
0
Devi "prendere", guardando il codice html, quel qualcosa (id o classe) che ti riesca a dare l'elemento che desideri.

Da una prima occhiata al codice html del forum di andoidiani ho notato che ogni "linea" rappresentante una sottocategoria del forum ha classe forumbit_post

Dopo che hai ottenuto tutti gli elementi con classe forumbit_post, puoi per ognuno di questi prenderti il titolo del forum, il numero delle discussioni, ecc...
È un po' un macello eh :-) è che ad ogni tentativo mi trovo schermate bianche :-(

https://play.google.com/store/apps/details?id=com.dd.batterystats by me


Offline Pipodi

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One X
  • Sistema operativo:
    Windows 7
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #10 il: 01 Ottobre 2013, 12:43:50 CEST »
0
Salve a tutti ragazzi! :) Ho appena iniziato a sviluppare app per Android, e cercavo proprio qualcosa riguardo lo spulciare il sourcecode delle pagine HTML. Non so se si evince dal codice qui sotto, ma sto cercando di creare un'app per League Of Legends. Io sono nuovissimo in questo campo, sto studiando Java all'università e quindi alcune cose sono ancora oscure per me, quindi non picchiatemi per eventuali "bestemmie" nel codice! XD (Come quel "debug" casareccio con i setText! XD) In poche parole, devo riuscire a prendere dal codice sorgente un link di un'immagine e poi inserirlo in una WebView per farlo visualizzare. Solo che l'app arriva fino al Try, poi va subito in eccezione, e non capisco perchè... Nel LogCat non c'è scritto nulla riguardo l'eccezione, solo ESEMPIO, ERRORE NEL PARSING. Cosa può scaturire questo comportamento?

Codice (Java): [Seleziona]
@Override
        protected String doInBackground(String... params) {
                        TextView prova = (TextView)findViewById(R.id.searchedName);
                        Document doc;
                        prova.setText("Punto Try");
                        try {
                                doc = Jsoup.connect("[url]http://www.lolking.net/summoner/euw/42997801")
                                         .userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
                                         .timeout(3000).get();
                                prova.setText("Arrivo");
                                String icon = doc.select("img[src$=.jpg]").first().text();
                                WebView summonerIcon = (WebView)findViewById(R.id.webView1);
                                summonerIcon.loadUrl(icon);
                        } catch (Exception e) {
                Log.e("ESEMPIO", "ERRORE NEL PARSING");
        }
        return null;

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #11 il: 01 Ottobre 2013, 14:54:09 CEST »
0
prova con e.getCause().getMessage() al posto di ERRORE NEL PARSING
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline Pipodi

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One X
  • Sistema operativo:
    Windows 7
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #12 il: 02 Ottobre 2013, 01:04:47 CEST »
0
Problema risolto! ;) Però ora ne sorge un altro... Devo recuperare un link, presente nel sourcecode del sito, ma un link particolare, che contiene una parola chiave da me inserita... Io ho usato questo codice:

Codice (Java): [Seleziona]
doc = Jsoup.connect("URL DEL SITO")
                   .userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
                    .timeout(3000).get();
Element summonerLink = doc.select("a[href=*/summoner/]").first();
summonerURL = summonerLink.attr("href");

In pratica devo trovare il primo link disponibile, che abbia come contenuto "summoner", per poi usarlo come stringa (summonerURL). Ho provato con una TextView con setText(summonerURL), ma rimane bianca, come se non trovasse il link in questione... Cosa può essere?

Offline oliweb

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #13 il: 19 Ottobre 2013, 17:33:33 CEST »
0
Salve, ho provato questo tutorial e mi da i seguenti errori in MainActivity.java:

alla riga:
.userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")

c'è questo errore:  The method userAgent(String) is undefined for the type Object

alle righe:
Element tabella = doc.getElementsByClass("table_list").first();

String descrizione = info.getElementsByTag("p").first().text();


questo errore:  The method first() is undefined for the type Object

alle righe:
Elements sezioni = tabella.getElementsByClass("content");

Elements righe_sezione = sezione.getElementsByClass("windowbg2");

String titolo = info.getElementsByClass("subject").first().text();


questo errore:
The method getElementsByClass(String) is undefined for the type Element



come posso risolverlo?


Grazie

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:[medio] Parsing html tramite Jsoup e visualizzazione in listview
« Risposta #14 il: 20 Ottobre 2013, 12:53:52 CEST »
0
Non saprei.... Hai importato correttamente la libreria nel tuo progetto?
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.