Autore Topic: Parsare html  (Letto 2186 volte)

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Parsare html
« il: 01 Marzo 2013, 10:31:41 CET »
0
Salve amici volevo realizzare una applicazione di un quotidiano della mia città in modo tale di evitare di utilizzare il browser del telefono e creare una semplice ma utile applicazione in cui mi vado a prendere tutti gli articoli tramite il parsing.
Premetto che non sono molto esperto nell'effettuare il parsing di una pagina html però voglio provarci .
Per il momento ho fatto una sola activity in cui mi collego al sito e mi prendo il titolo di un articolo giusto per provare a vedere se sto procedendo nel modo corretto quindi ho una semplice textview in cui vado a mettere il mio risultato.
Sto utilizzando la classe Jsoup di java
Codice (Java): [Seleziona]
private TextView testo;
        private ArrayList<String> stringList = new ArrayList<String>();
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        testo = (TextView)findViewById(R.id.result);
       
        Document doc = null;                                      
        try {                                              
            doc = Jsoup.connect("http://www.gazzettabenevento.it/Sito2009/main.php").get();
            Element result = (doc.getElementById("sTitoloCentro"));
            System.out.println(result);
            testo.setText(""+ result);
        } catch (IOException e) {                          
            e.printStackTrace();                    
        }      

     
       
    }


Però quando lancio l'emulatore mi da un errore e da quanto ho capito non riesce a collegarsi al sito
Il logcat è il seguente:

03-01 10:29:26.139: E/AndroidRuntime(263): FATAL EXCEPTION: main
03-01 10:29:26.139: E/AndroidRuntime(263): java.lang.NoClassDefFoundError: org.jsoup.Jsoup
03-01 10:29:26.139: E/AndroidRuntime(263):    at pervasive.com.provaparsing.MainActivity.onCreate(MainActivity.java:30)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.os.Looper.loop(Looper.java:123)
03-01 10:29:26.139: E/AndroidRuntime(263):    at android.app.ActivityThread.main(ActivityThread.java:4627)
03-01 10:29:26.139: E/AndroidRuntime(263):    at java.lang.reflect.Method.invokeNative(Native Method)
03-01 10:29:26.139: E/AndroidRuntime(263):    at java.lang.reflect.Method.invoke(Method.java:521)
03-01 10:29:26.139: E/AndroidRuntime(263):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-01 10:29:26.139: E/AndroidRuntime(263):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-01 10:29:26.139: E/AndroidRuntime(263):    at dalvik.system.NativeStart.main(Native Method)

P.s.C'e qualche bel tutorial che mostra come parsare un sito html? Mi farebbe davvero comodo
Grazie.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Parsare html
« Risposta #1 il: 01 Marzo 2013, 10:39:05 CET »
0
03-01 10:29:26.139: E/AndroidRuntime(263): FATAL EXCEPTION: main
03-01 10:29:26.139: E/AndroidRuntime(263): java.lang.NoClassDefFoundError: org.jsoup.Jsoup

Jsoup non è una libreria standard java.
Mi sembra che semplicemente non viene inclusa nell'apk, l'hai messo il jar nella cartella libs del progetto?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Parsare html
« Risposta #2 il: 01 Marzo 2013, 10:54:55 CET »
0
Jsoup non è una libreria standard java.
Mi sembra che semplicemente non viene inclusa nell'apk, l'hai messo il jar nella cartella libs del progetto?

La soluzione del problema ti è già stata indicata.
Aggiungo che non dovresti fare il parser nel thread UI principale.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #3 il: 01 Marzo 2013, 11:00:28 CET »
0
Adesso l'ho importata come hai detto tu ho copiato  il file jsoup e l'ho incollato nella cartella libs del relativo progetto e adesso effettivamente va però non mi ha dato nessun risultato nella textview .


"Aggiungo che non dovresti fare il parser nel thread UI principale."
Ma non c'e una guida semplice che mi possa fa capire effettivamente come si faccia il parsing di una pagina html??

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Parsare html
« Risposta #4 il: 01 Marzo 2013, 11:10:18 CET »
0
Citazione
"Aggiungo che non dovresti fare il parser nel thread UI principale."
Ma non c'e una guida semplice che mi possa fa capire effettivamente come si faccia il parsing di una pagina html??
Il problema qui non è il parsing in sè, ma il fatto che tale operazione è potenzialmente bloccante e, come tale, va svolta in un thread diverso da quello principale.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #5 il: 01 Marzo 2013, 22:11:18 CET »
0
Quindi mi stai dicendo che devo creare un nuovo package e creare una nuova classe e li dentro faccio il parsing?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Parsare html
« Risposta #6 il: 01 Marzo 2013, 23:32:05 CET »
0
Advice "non tecnico": Informati se legalmente puoi fare questa cosa. Altri sviluppatori (c'è una discussione qui sul forum) hanno dovuto rimuovere app simili dal play store perché minacciati dai legali del giornale in questione.

Inviato dal mio Galaxy Nexus con Tapatalk 2


Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #7 il: 01 Marzo 2013, 23:41:19 CET »
0
Ciao Ricky grazie mille per l'informazione.
Comunque é una cosa che voglio realizzare per mestesso perché sinceramente é un quotidiano che leggo spesso e mi da noia visualizzarlo da browser e vorrei fare un'applicazione che alla fine verrà utilizzata solo da me.e poi vorrei finalmente capire come si fa il parsing cosa che sinceramente non so ancora fare.

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Parsare html
« Risposta #8 il: 01 Marzo 2013, 23:54:08 CET »
+1
Citazione
Quindi mi stai dicendo che devo creare un nuovo package e creare una nuova classe e li dentro faccio il parsing?
No, sto dicendo di fare l'operazione di parsing su un thread diverso da quello principale. Su Android, se il thread principale - che è quello che gestisce la UI - rimane bloccato (in elaborazione, per intenderci) per più di 5 secondi (10 se sei dentro un BroadcastReceiver), l'app va in ANR (Application Not Responding). Praticamente esplode.
Per questo, tutte le operazioni potenzialmente bloccanti (chiamate HTTP, elaborazioni pesanti come il parsing...) vanno eseguite su un thread separato.
Una soluzione veloce (non sempre la migliore!) è quella di ricorrere ad un AsyncTask.

Qualche info sull'argomento:
http://android-developers.blogspot.it/2009/05/painless-threading.html
http://developer.android.com/training/articles/perf-anr.html

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #9 il: 03 Marzo 2013, 03:58:41 CET »
0
Ho iniziato a scrivere qualcosa per quanto riguarda il parsing però non riesco a fare una cosa.
Il sito e composto da notizie che si trovano sul lato sinistro della pagina, poi altre notizie al centro e altre notizie sul lato destro.
Mettiamo caso che io voglio prelevare tutti i titoli degli articoli che si trovano sul lato sinistro, faccio così:

Codice (Java): [Seleziona]
Document doc = Jsoup.connect("http://www.gazzettabenevento.it/Sito2009/main.php").get();
   
                Elements links = doc.select(".sTitoloSinistra");       
                for (Element link : links) {
                        System.out.println("\nlink : " + link.attr("a[href]"));
                        System.out.println("text : " + link.text());


però vorrei prendere anche i relativi link degli articoli ossia que link che mi indirizzano all'articolo completo,però non ci riesco non so come combinarlo nel doc.select
Qualcuno mi può illuminare??
Grazie mille

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #10 il: 07 Marzo 2013, 01:21:18 CET »
0
Possibile che non ci sia nessuno in grado di aiutarmi??

Post unito: 07 Marzo 2013, 01:43:27 CET
Ho corretto il codice ed ho quasi risolto.Dico quasi perche io vorrei prelevare i link con i relativi titoli degli annunci della sola area di sinistra del sito, invecea me prende tutte le notizie.
Ho analizzato l'html e i titoli con i relativi link che a me interessano sono divisi dalla classe "sTitoloSinistra", "sTitoloDestra", "sTitoloCentro"

Io ho scritto questo:
Codice (Java): [Seleziona]
                Document doc = Jsoup.connect("http://www.gazzettabenevento.it/Sito2009/main.php").get();
   
                Elements links = doc.select("a[href]");
                for(Element link : links) {
                System.out.println(link.attr("href"));
                System.out.println(link.text());
               
                }

Come posso specificare che mi deve prendere ad esempio solo i relativi link e titoli appartenenti alla class "sTitoloSinistra"??
Perpiacere mi dite come devo correggere il mio codice??
« Ultima modifica: 07 Marzo 2013, 01:43:27 CET da moskino11, Reason: Merged DoublePost »

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Parsare html
« Risposta #11 il: 07 Marzo 2013, 08:15:29 CET »
0
Premetto che non ho mai usato Jsoup, io per il parsing di una pagina web ho utilizzato un'altra libreria, Jericho, e mi son trovato molto bene.

Comunque non so se hai notato ma gli elementi sTitoloSinistra vengono dopo gli href.

In ogni caso il mio consiglio é quello di cercare un elemento padre che contenga i dati che ti interessano e poi di ciclare nei figli alla ricerca di link e testi.
I numeri contano molto di più del seme.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #12 il: 09 Marzo 2013, 02:05:55 CET »
0
Grazie per la risposta, ho provato a farlo ma non l'ho saputo fare -.-
Me lo potresti far vedere per piacere come si fa?

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Parsare html
« Risposta #13 il: 11 Marzo 2013, 08:32:01 CET »
0
Cosa dovrei farti vedere?
I numeri contano molto di più del seme.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsare html
« Risposta #14 il: 12 Marzo 2013, 13:14:14 CET »
0
come fare a prendere i link , i titoli(cosa che sono riuscito a fare) però selezionare solo quelli che hanno la class=sTitoloSinistra se è possibile perpiacere