Autore Topic: Parsing pagina Wikipedia come plinkArt  (Letto 1228 volte)

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Parsing pagina Wikipedia come plinkArt
« il: 21 Giugno 2010, 17:17:15 CEST »
0
Ragazzi come sempre ho bisogno di qualche consiglio. Dovrei fare il parsing di una pagina wikipedia (anche la versione mobile) per prendere il testo dell'articolo, praticamente come fa PlinkArt per capirci. Qualcuno sa aiutarmi per dirmi come iniziare a muovermi? Grazie mille.

Offline Vytek

  • Translate Team
  • Utente junior
  • **
  • Post: 125
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung S5
  • Sistema operativo:
    Windows 8.1
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #1 il: 21 Giugno 2010, 17:54:43 CEST »
0
Sto avendo lo stesso problema. E stavo vedendo questo progetto:

Jwbf - Getting Started

Che ne dite?

Un saluto...

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #2 il: 21 Giugno 2010, 18:23:15 CEST »
0
Ok meglio che siamo in due ad avere lo stesso problema, così siamo + motivati! Io stavo già pensando "oltre" perchè ste api pronte sono mal documentate! Guardando un po' i sorgenti di una pagina wikipedia mi pare di vedere che il testo "utile" sia sempre fra tag <p> e <\p> ora sta tutto a prendere i contenuti di sti tag e poi pulire tutto quello "extra" ovvero tutti gli altri tag e quello che contengono salvando solo ed esclusivamente il testo, magari al massimo le informazioni di "a capo" e "nuovo paragrafo".
Dunque si potrebbe fare:
1.prendere tutto il codice html della pagina wikipedia (con la url già caricata)
2. Scorrere tutto il codice e prendere solo ed esclusivamente i dati contenuti fra <p> e <\p>
3. Per ogni paragrafo preso fare la pulizia da tutti gli altri tag salvando solo il testo!


Che ne dite? Se l'idea è corretta come implementarla?

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #3 il: 21 Giugno 2010, 20:55:47 CEST »
0
stavo leggendo questa guida [medio] Ottenere dati da una pagina HTML - Android Developers Italia e effettivamente potrebbe fare al caso nostro però leggevo anche il progetto da te  linkato e sembra documentato abbastanza bene, si potrebbe provare prima questo e in caso di mesto fallimento passare alla forza bruta.  Aspetto tuoi feedback e intanto continuo a documentarmi


EDIT: Ma anche No, è documentato manco il piffero cavoli... dobbiamo navigare a naso.....

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #4 il: 21 Giugno 2010, 21:37:04 CEST »
+1
Se vi basta poter estrarre del contenuto da una data pagina, potrebbe farvi comodo la funzione di "export" della pagina stessa in XML, probabilmente molto più parsabile dell'HTML. Se vi è d'aiuto, qua si trova come fare http://en.wikipedia.org/wiki/Help:Export, altrimenti ingorate il mio intervento.  :-P
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vytek

  • Translate Team
  • Utente junior
  • **
  • Post: 125
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung S5
  • Sistema operativo:
    Windows 8.1
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #5 il: 21 Giugno 2010, 21:47:14 CEST »
0
La questione non è di facile soluzione. Se prendi anche una pagina qualsiasi troverai che il codice HTML generato è tantissimo e non è assolutamente facile creare un parser per l'elaborazione del tutto.

Un buon punto di partenza per la pulizia del codice HTML:

HtmlCleaner Project Home Page

Se si vuole qualcosa di più semplice forse qualcosa del genere già va bene:
http://en.wikipedia.org/wiki/User:MER-C/Wiki.java

Ma c'e' comunque da lavorare e riscrivere un po' il tutto per Android.

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #6 il: 21 Giugno 2010, 23:13:10 CEST »
0
Se vi basta poter estrarre del contenuto da una data pagina, potrebbe farvi comodo la funzione di "export" della pagina stessa in XML, probabilmente molto più parsabile dell'HTML. Se vi è d'aiuto, qua si trova come fare http://en.wikipedia.org/wiki/Help:Export, altrimenti ingorate il mio intervento.  :-P

La cosa sembra interessante ma non riesco ad esportare nemmeno una pagina in xml....

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #8 il: 22 Giugno 2010, 09:57:36 CEST »
0
Ah ok allora facevo bene, solo che non esce praticamente niente dell'articolo con la conversione in xml....a questo punto è una idea da abbandonare, bisogna procedere con il parsing html

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #9 il: 22 Giugno 2010, 11:46:33 CEST »
0
Ok, credo di essere arrivato ad un buon punto. A noi interessa solo il testo contenuto nei paragrafi, giusto? A questo punto con queste due istruzioni
Codice (Java): [Seleziona]
rootNode=rootNode.findElementByName("p", true); //Prende solo i paragrafi (tag p), ora solo il primo....
                testo.setText(rootNode.getText()); //All'interno della parte selezionata prende solo ed esclusivamente il testo.

prendo dal nodo generico solo i nodi fatti da paragrafi (ora sto cercando di capire la situazione quindi banalmente prende solo il primo) da questi poi estrae solo ed esclusivamente il testo. A quanto pare si sta mostrando + semplice di quanto pensassimo.

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #10 il: 22 Giugno 2010, 12:09:31 CEST »
0
Bon, risolto, ora sarebbe bello però prendere anche qualcosa della formattazione oppure i titoli dei paragrafi in grassetto ecc.

Ecco il codice
Codice (Java): [Seleziona]
package prova.parser;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

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

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

public class Parser extends Activity {
        private TagNode rootNode;
        private String url_str = "http://en.wikipedia.org/wiki/Dog";
       
        /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView testo = (TextView)findViewById(R.id.Parser);
     // 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());
                }
                TagNode[] nodes= rootNode.getElementsByName("p", true); //Prende solo i paragrafi (tag p), ora solo il primo....
               
                for(int i=0; i<nodes.length; i++){
                testo.append("\n"+nodes[i].getText()+"\n"); //All'interno della parte selezionata prende solo ed esclusivamente il testo.
                }
    }
}

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #11 il: 22 Giugno 2010, 13:14:09 CEST »
0
Premetto che sarebbe utile togliere i "sup" che sono proprio brutti, forse si può sfruttare il metodo che ti fa la remove dal nodo sempre della classe html cleaner ovvero removeAttributes, ora ci provo. Per ora ho aggiunto un altro step.

Così prendiamo anche la formattazione mostrando a video il testo come html formattato e convertito in spanned text
Codice (Java): [Seleziona]
TagNode[] nodes= rootNode.getElementsByName("p", true);
               
                for(int i=0; i<nodes.length; i++){
                        //HINT Puoi prendere il nodo nodes[i] e serializzarlo in outputStream, poi prendere il metodo Html.fromHtml e dallo stream in ingresso
                        //convertito in stringa vedere che ci esce.
                        XmlSerializer serializer =new SimpleXmlSerializer(props);
                       
            try {
                        testo.append(Html.fromHtml(serializer.getXmlAsString(nodes[i])));
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        Log.e("Error", e.getMessage());

                }      
                //testo.append("\n"+nodes[i].getText()+"\n"); //All'interno della parte selezionata prende solo ed esclusivamente il testo.
                }

EDIT 2:
Ho provato con removeAttribute("sup") ma non funziona, qualcuno ha idea del perchè?
« Ultima modifica: 22 Giugno 2010, 13:24:03 CEST da dodopepper »

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #12 il: 22 Giugno 2010, 13:37:29 CEST »
0
Risolto pure questo, il problema era che provavo a togliere un attributo. Ho risolto con queste istruzioni


Codice (Java): [Seleziona]
TagNode[] nodesToRemove=rootNode.getElementsByName("sup", true);
                for (int i=0;i<nodesToRemove.length;i++)
                nodesToRemove[i].removeFromTree();
« Ultima modifica: 22 Giugno 2010, 13:52:16 CEST da JD, Reason: usate i bbcode java e xml!! XD »

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #13 il: 22 Giugno 2010, 16:48:14 CEST »
0
JD non ho capito il motivo della correzione e cosa hai corretto :-[

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Parsing pagina Wikipedia come plinkArt
« Risposta #14 il: 22 Giugno 2010, 16:52:17 CEST »
0
Niente di grosso, come scritto nel Motivo ho solo sistemato il bbcode code per evidenziare la sintassi java ;)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !