Consiglio su parsing in java

di il
21 risposte

Consiglio su parsing in java

Ciao amici sto effettuando un parsing da una pagina html.
Uso eclipse e per fare il parsing utilizzo la libreria jsoup.
Il sito in questione è il seguente:
http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=
e i dati che voglio prelevare dal sito sono le date e il nome della farmacia.

Ho abbozzato qualcosino in java però quando lo mando in esecuzione ma mi stampa solo le date e in maniera sporca, cioè con i tag

Il codice è il seguente:
  Document doc = Jsoup.connect("http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=").get();
 
               		
        Element tbody = doc.select("table[width=809]").first().child(0);
        	
        Elements sezioni = tbody.getElementsByTag("tr");
        	   
        for(Element sezione : sezioni)
        {
        	Elements righe_sezione = sezione.getElementsByTag("strong");
        	
        	for(Element riga : righe_sezione)
        	{
        		//String titolo = riga.getElementsByAttribute("strong").text();
        		System.out.println(riga);
        		System.out.println("\n");
        	}
        }
    }    
Mi dareste qualche consiglio?
Grazie...

21 Risposte

  • Re: Consiglio su parsing in java

    Perché ometti i tag?
    
     Elements sezioni = tbody.getElementsByTag("<tr>");
     Elements righe_sezione = sezione.getElementsByTag("<strong>");
    [code]
  • Re: Consiglio su parsing in java

    Se faccio come dici tu non mi stampa niente
  • Re: Consiglio su parsing in java

    In questo modo riesco a prelevare alcuni dati di mio interesse però è sorto un problema, praticamente vado a stampare il testo parsati e al posto dello spazio compare un punto interrogativo. Guardando attentamente il file html ho notato che questo ? che mi compare, corrispose al seguente codice html &nbsp;
    ho cercato in rete alcuni metodi per eliminarlo ma senza riuscirci purtroppo.
  • Re: Consiglio su parsing in java

    Ho cercato un po in rete ed ho visto.
    Jsoup.parse(html).text();
    http://stackoverflow.com/questions/9631477/retrieve-text-from-html-file-in-java
    Cmq dovresti far si di trasformare quello che ti vien fuori dall'estrazione da HTML in testo (perché &nbsp; non è altro che lo spazio in HTML) e credo che il JSoup faccia già una cosa del genere

    Ciao
  • Re: Consiglio su parsing in java

    Ragazzi siccome non mi "apparo" molto con questa libreria mi potreste guidare nel mio obbiettivo ?(cioè prendere dal sito specificato il testo indicante la data e poi fare un'altro parsing in cui prelevo le farmacie)

    allora qui mi collego alla pagina html
      Document doc = Jsoup.connect("http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=").get();
    poi seleziono il tag table con attributo width=809
      Element tbody = doc.select("table[width=809]").first().child(0);
    mi prendo tutti i fligli di tbody
     Elements rows = tbody.children();
    quindi mi prendo tutti gli elementi con i tag <tr>
    ma siccome le informazioni che servono a me si trovano nel 5° tag <tr>, ho visto che la libreria jsoup ha un metodo remove quindi ho voluto rimuovere i primi 4 tag <tr> con il seguente comando, ma mi da errore
     rows.remove();
     rows.remove();
     rows.remove();
     rows.remove();
    cosa sbaglio?
  • Re: Consiglio su parsing in java

    L'errore che mi da è il seguente:
    Exception in thread "main" java.lang.IllegalArgumentException: Object must not be null
    	at org.jsoup.helper.Validate.notNull(Validate.java:16)
    	at org.jsoup.nodes.Node.remove(Node.java:275)
    	at org.jsoup.select.Elements.remove(Elements.java:403)
    	at ProvaTest.main(ProvaTest.java:26)
    
  • Re: Consiglio su parsing in java

    Semplicemente usi il metodo remove quando non c'è più alcun oggetto da eliminare e quindi ti scatta l'eccezione.
    Prima di rimuovere, vedi che oggetto c'è all'interno, cancellare in maniera così indiscriminata senza sapere cosa all'interno non è mai molto bello...fai una prova con un debugging.

    Ciao.

    P.S. ho fatto un controllo.
    Ma scusa cosa te ne fai del remove?!?
    Ho visto che la tua variabile "rows" ha 9 elementi....
    Vuoi il 4° elemento?
    
    rows.get(3);
    
    Vuoi il quinto?
    
    rows.get(4);
    
    Poi puoi memorizzarti l'elemento una una variabile ad esempio
    
     Element riga = rows.get(i);
    
    dove i è l'indice che tu decidi.

    Perché incamponirsi nelle scelte più difficili?
    vuoi che poi per ragioni di performance la variabile Elements non esista più e venga cancellata?
    
    rows=null;
    
    Se usavi il remove dovevi mettere come argomento il numero dell'elemento.

    Ma devi sempre stare attento perché alla cancellazione di uno dei "record" il vettore degli elementi diventa n=n-1;

    Per cui usa la soluzione più semplice.

    Ciao.
  • Re: Consiglio su parsing in java

    Purtroppo non conosco bene questa libreria , come mi piacerebbe trovare una guida che spiega ogni metodo. Ma non c'e qualcosa on line? comunque ora provo i tuoi preziosi suggerimenti... e ti faccio sapere Grazie mille.
  • Re: Consiglio su parsing in java

    Ciao schumy2000, sono riuscito a prendermi finalmente tutte le scritte in grassetto con il seguente codice:
     // cambiando i valori di get, riesco a prendermi tutti i titoli
    		   String titolo = riga.select("div span strong").get(0).text();
    		   System.out.println(titolo);

    anche se devo ancora risolvere il problema dei ?

    Ora però devo riuscire a prendere allo stesso modo, i nomi delle farmacie e volevo utilizzare la stessa sintassi, modificando man mano l'indice del metodo get, però non riesco a capire quali sono i tag che devo specificare nel metodo select().
    Per farti capire meglio, ciò che mi interessa è la seguente stringa: "Farmacia Fatebenefratelli, viale Principe di Napoli. Riposo settimanale 10 e 17 maggio"

    Grazie ancora per l'aiuto che mi stai dando
  • Re: Consiglio su parsing in java

    Sei riuscito?

    Qual'è il problemi che incontri?
    Basta studiarsi la pagina da "parsare" che dovrebbe venire da se ciò che vuoi togliere e quindi quello da ottenere.

    Ciao.

    P.S.
    Se non sei riuscito con i punti interrogativi prova così
    
    	String url="http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=";
    
            Document doc = Jsoup.parse(new java.net.URL(url).openStream(), "ISO-8859-1", url);       
            Element tbody = doc.select("table[width=809]").first().child(0);
           	Elements rows = tbody.children();
           	Element riga=rows.get(4);
            System.out.println(riga.text());
    
    
    sfrutta la codifica ISO-8859-1 in modo tale da poter fare l'encode in maniera corretta.
    infatti se fai solo la System.out.println(riga); vedrai i caratteri speciali con i rispettivi codici HTML esempio
    &egrave; per la e accentata
    &deg; per pallino
    &nbsp; per lo spazio
    e cosi via.

    Facendo il text vengono convertiti automaticamente in testo quindi eviti il codice HTML e quindi anche quel brutto punto interrogativo.

    Ciao
  • Re: Consiglio su parsing in java

    Al momento sono riuscito a caricare mostrare e dividere tutte le farmacia con un metodo maccheronico:
    
            Document doc = Jsoup.parse(new java.net.URL(url).openStream(), "ISO-8859-1", url); 
            Elements tbody = doc.getElementsByClass("sTestoDettaglio");
            String[] names=rows.text().split("Farmacia");
            int index=0;
            for(String name : names){
                 System.out.println(index+") Farmacia"+name);
                 index++;
            }
    
    Ho guardato attentamente e nella riga della farmacia non c'è alcun particolare tag.
    Quindi mi prendo la riga e visto che la parola Farmacia è l'unica parola comune a tutti le righe divido tutto con la split.
    La riga 0 non devi contarla perché contiene anche il titolo poi sono tutte corretti.
    Molto maccheronico ma in mancanza di tag nella riga della farmacia non si può far altro.

    Direttamente prendo la classe Elements tbody=doc.getElementsByClass("sTestoDettaglio"); così evito altri codici spuri.

    Ciao.
  • Re: Consiglio su parsing in java

    Grazie mille per l'aiuto che mi stai dando....appena posso stasera lo provo.A presto ciao
  • Re: Consiglio su parsing in java

    Ciao, ho provato anche io a tirare fuori qualcosa da questo sito (potevano farlo meglio, se vogliamo dirla tutta), con questo codice:
    			String url = "http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=";
    			Document doc = Jsoup.parse(new URL(url).openStream(), "ISO-8859-1", url);
    
    			Element mainContainer = doc.select(".sTestoDettaglio > div > span > span").first();
    			Elements periodo = mainContainer.select("strong");
    			for (Element e : periodo) {
    				System.out.println(e.ownText());
    				System.out.println(StringEscapeUtils.unescapeHtml4(e.nextSibling().toString()));
    				System.out.println();
    			}
    
    Riesco a tirare fuori questo:
    Mese di giugno 2014
    <span style="font-family: Verdana"><em>Dal 1° luglio 2013 al 31 agosto 2013 l'apertura delle farmacie è così fissata: antimeridiana dalle 8.45 alle 13.00 e pomeridiana dalle ore 17.00 alle ore 20.30; dal 1° settembre 2013 al 30 giugno 2014: antimeridiana dalle ore 8.45 alle ore 13.00 e pomeridiana dalle ore 16.30 alle ore 20.00.</em></span>

    Servizio pomeridiano e festivo
    <br />

    dal 01 giugno al 01 giugno
    Farmacia San Diodato, viale Mellusi. Riposo settimanale 07 e 14 giugno

    dal 02 giugno al 07 giugno
    Farmacia Mercaldo, via Napoli. Riposo settimanale 21 e 28 giugno

    dal 08 giugno al 14 giugno
    Farmacia Maurizio Manna, corso Vittorio Emanuele. Riposo settimanale 21 e 28 giugno

    dal 15 giugno al 21 giugno
    Farmacia Conte, via Croce Rossa, rione Capodimonte

    dal 22 giugno al 28 giugno
    Farmacia Pascucci, via Porta Rufina

    dal 29 giugno al 05 luglio
    Farmacia Pacevecchia, via Fratelli Rosselli, Rione Pacevecchia

    Servizio notturno
    <br />

    dal 01 giugno al 03 giugno
    Farmacia Italiano, via Napoli

    dal 04 giugno al 07 giugno
    Farmacia Pascucci, via Porta Rufina. Riposo settimanale 10 giugno

    dal 08 giugno al 10 giugno
    Farmacia Affinito, piazza Colonna, Stazione Centrale.  Riposo settimanale 14 e 28 giugno

    dal 11 giugno al 14 giugno
    Farmacia del Grosso, via Perasso. Riposo settimanale 21 e 28 giugno

    dal 15 giugno al 17 giugno
    Farmacia Fatebenefratelli, viale Principe di Napoli

    dal 18 giugno al 21 giugno
    Farmacia saviano, via Cocchia. Riposo settimanale 28 giugno

    dal 22 giugno al 24 giugno
    Farmacia Pacevecchia, via Fratelli Rosselli

    dal 25 giugno al 28 giugno
    Farmacia Eredi Manna, piazza Orsini

    dal 29 giugno al 05 luglio
    Farmacia Melchiorre, via Gaetano Rummo.
    In particolare ho usato la libreria commons-lang di Apache (vedi la classe StringEscapeUtils).
    Migliorando alcune parti si può ottenere ciò che chiedi!
  • Re: Consiglio su parsing in java

    Si effettivamente questo sito fa piangere...non sono un esperto da quel poco che capisco si vede che non è strutturato in modo molto chiaro. Comunque grazie davvero per l'aiuto che mi state dando siete gentilissimi ... in questo momento mi sto preparando un esame che ho a breve per questo ci sto lavorando poco su questa cosa del parsing comunque stasera vedrò i vostri preziosi consigli e vi farò sapere....grazie ancora!!!
Devi accedere o registrarti per scrivere nel forum
21 risposte