PDA

View Full Version : [JAVA]parsing di pagine web


gepeppe
06-02-2012, 14:55
Salve, sto scrivendo un progetto java, e avrei bisogno di effettuare il parsing di alcune pagine web, in modo da estrarre dei contenuti (testo in specifici tag div, p ecc..). Come posso realizzarlo in java?

Grazie

banryu79
06-02-2012, 15:13
Salve, sto scrivendo un progetto java, e avrei bisogno di effettuare il parsing di alcune pagine web, in modo da estrarre dei contenuti (testo in specifici tag div, p ecc..). Come posso realizzarlo in java?

Grazie
Ciao, puoi appoggiarti a librerie già esistenti e mature per costruire la tua applicazione. Ad esempio vedi:
- html parser (http://htmlparser.sourceforge.net/)
- jsoup (http://jsoup.org/)
Queste si smazzano tutta la complessità del parsing al posto tuo e ti sputano la pagina in un formato strutturato (tipicamente un dom) pronto al consumo (elabori quel che ti serve).

Se invece devi fare tutto "a mano" allora la strada è più lunga (molto più lunga) e dipende anche da che cosa devi realizzare di preciso.
Comunque, di base, da un oggetto URL su cui hai aperto una connessione puoi ricavare l'Inputstream associato, ergo puoi acquisire i dati a cui punta l'url (ad esempio la pagina html). Vedi i dati come una stringa di testo, e in qualche modo ne fai il parsing (tipicamente a colpi di magia voodoo con le regex) ed elabori quel che devi elaborare: la complessità dipende da come è fatta la pagina e da quanto e cosa ci devi fare.

gepeppe
06-02-2012, 15:28
ti ringrazio, jsoup mi sembra più completo di html parser. Penso che opterò per il primo + eclipse :D

E se invece volessi inviare dati ad una pagina html?

Faccio un esempio con wikipedia. Dalla mia applicazione voglio cercare una pagina in wikipedia. Allora vorrei inviare una stringa alla pagine di wikipedia e dirgli "cerca questo", e recuperare quello che la pagina mi restituisce facendo poi il parsing e togliendo e/o risistemandola a modo mio. Devo cercare di capire come realizzare una cosa del genere

banryu79
06-02-2012, 15:55
Dalla mia applicazione voglio cercare una pagina in wikipedia. Allora vorrei inviare una stringa alla pagine di wikipedia e dirgli "cerca questo", e recuperare quello che la pagina mi restituisce facendo poi il parsing e togliendo e/o risistemandola a modo mio. Devo cercare di capire come realizzare una cosa del genere
Se l'esempio che hai fatto con Wikipedia non è solo un esempio ma è proprio ciò che vuoi realizzare, allora la prima cosa da fare è chiedersi (per poi scoprire) se quel servizio web (Wikipedia) espone una API.

Fino a 5 minuti fa non ne sapevo niente ma con una piccola ricerca ho appreso che sì, Wikipedia espone un'API (più precisamente è MediaWiki che espone un'API per i servizi che supporta, tra cui Wikipedia).
- link a MediaWiki (pagina di Wikipedia) (http://en.wikipedia.org/wiki/MediaWiki)
- link a MediaWiki API page (http://www.mediawiki.org/wiki/API)

Andando a leggersi i termini d'uso e studiandosi l'API in questione sarebbe poi possibile costruire una propria applicazione che si interfaccia con Wikipedia tramite quella API (e dimenticare la facceda dello scraping delle pagine html, che, per quanto interessante di per se, è pur sempre una faccenda sporca, rozza & forse neanche tanto "pulita" dal punto di vista legale [bisogna prima informarsi però]).

gepeppe
06-02-2012, 16:17
non avevo pensato di usare le api... ho controllato ed esistono anche per il sito di cui ho bisogno (simile a wikipedia). Magari cosi mi risulta più semplice programmare l'applicazione XD

gepeppe
10-02-2012, 18:35
Ho notato un piccolo problema. Se ad esempio vedo una pagina web (il risultato di una ricerca) con firebug vedo una cosa (tutte le informazioni di cui ho bisogno), se ne vedo una con "mostra sorgenti pagina" di firefox, ne vedo una meno completa...purtroppo JSOUP da quanto ho visto, vede solo la seconda possibilità!

C'è un modo per risolvere il problema?

wingman87
11-02-2012, 01:34
Vuol dire che alcuni elementi della pagina sono stati caricati tramite javascript, forse ajax. Questo è un ottimo motivo per usare le API apposite.

gepeppe
11-02-2012, 16:36
no, in quest'altro sito non ci sono API disponibili purtroppo. Quindi devo inviare i dati dal programma java verso il form (metodi post e get, dipende) della pagina tot.html, e recuperare la pagina di risposta.

tomminno
12-02-2012, 11:48
Ho notato un piccolo problema. Se ad esempio vedo una pagina web (il risultato di una ricerca) con firebug vedo una cosa (tutte le informazioni di cui ho bisogno), se ne vedo una con "mostra sorgenti pagina" di firefox, ne vedo una meno completa...purtroppo JSOUP da quanto ho visto, vede solo la seconda possibilità!

C'è un modo per risolvere il problema?

Non è che per caso ci sono iframe per cui hai i contenuti sparsi su più pagine?
Un'altra alternativa potrebbe essere quella di integrare un browser vero nel tuo software (WebKit, Firefox).
Ad esempio per Firefox qui c'è un esempio: http://stackoverflow.com/questions/2020854/embed-firefox-browser-in-java-swing

gepeppe
12-02-2012, 14:08
non ne ho idea, cmq potete controllare, la pagina di cui parlo è quella di mymovies.it (volevo realizzare un'applicazione personale, per ora, per android...visto che il sito non ha neppure una versione mobile decente)... con altri siti sono riuscito a recuperare i vari tag html tramite jsoup, con questo non ci riesco...

Se effettuo una ricerca, sembra che la "sezione" dei risultati non venga recuperata da jsoup (che invece recupera tutto il resto che ne fa da "contorno")

banryu79
13-02-2012, 10:14
no, in quest'altro sito non ci sono API disponibili purtroppo. Quindi devo inviare i dati dal programma java verso il form (metodi post e get, dipende) della pagina tot.html, e recuperare la pagina di risposta.
In pratica sì.
Occhio però alla questione legale (stai facendo web scraping), sempre che la stessa ti interessi. In questa pagina puoi cominciare a farti un'idea:
http://www.galvanilegal.com/is-web-scraping-legal

La prima cosa che farei, fossi al tuo posto, è vedere se il sito fornisce i "termini d'uso" dello stesso per poi leggerli e verificare che non sia esplicitamente vietato lo scraping dei contenuti (vedi il link per maggiori info).

gepeppe
13-02-2012, 11:55
grazie, non credevo che non fosse legale, non l'avevo mai vista sotto questo punto di vista. Grazie :)