Forse un giorno avrai bisogno di ottenere informazioni da un sito Web o da un documento HTML nella tua applicazione e dirò senza ulteriori indugi che l'utilizzo della libreria jsoup semplificherà notevolmente il tuo compito. Secondo il wiki , jsoup è una libreria Java open source progettata per analizzare, estrarre e manipolare i dati archiviati in documenti HTML.
Inizio veloce
La libreria può essere scaricata come file jar e inserita in un progetto o connessa utilizzando Maven/Gradle. Lascerò il link al sito ufficiale alla fine dell'articolo: lì puoi trovare la versione attuale della libreria. Nell'esempio utilizzeremo la connessione tramite Maven. Aggiungiamo una dipendenza:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Utilizzo
Prima di tutto, devi ottenere un'istanza della classeDocument
da org.jsoup.nodes.Document indicando la fonte per l'analisi. Può essere un file locale o un collegamento. Ad esempio, in questo articolo utilizzeremo il sito web yandex.ru e proveremo a ottenere il loro feed di notizie attuale:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
è un identificativo che viene comunicato al sito che si sta visitando. In molti siti è il criterio più importante per il filtro antispam. Referrer
contiene l'URL dell'origine della richiesta. Il metodo get()
lancia un'IOException gestita, quindi possiamo racchiudere tutto in try/catch
un blocco o semplicemente lanciarlo ulteriormente con throws
. Ora abbiamo ricevuto il codice sorgente per questa pagina. Se necessario, la stessa libreria jsoup può ripristinare gli elementi danneggiati. Ora tutto ciò che dobbiamo fare è restringere la ricerca a un blocco separato. Il metodo select()
ha un'ampia scelta di usi: consente di cercare elementi per tag, attributi, classe e altri parametri. Quasi tutti i browser moderni supportano la possibilità di cercare rapidamente il codice sorgente di un elemento selezionato. Con semplici manipolazioni, troviamo il codice sorgente dell'elemento di cui abbiamo bisogno e otteniamo div
un blocco con la classe specificata, che utilizzeremo per il campionamento. Usiamo la classe Elements
da org.jsoup.select.Elements per selezionare tutti gli elementi dal nostro blocco selezionato.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Ora abbiamo qualcosa del genere: Ora tutto ciò che dobbiamo fare è usare un piccolo ciclo per scorrere tutti gli elementi:
for (Element element : listNews.select("a"))
System.out.println(element.text());
Il metodo text()
consente di eliminare il codice di markup e lasciare solo una combinazione di testo per tutti gli elementi in entrata. Il risultato dell'esecuzione sarà il seguente: È facile notare che il numero effettivo di righe ricevute non corrisponde all'effettiva visualizzazione sulla pagina. È qui che risiedono le insidie. Se guardi il codice sorgente del markup, noterai che le ultime notizie cambiano animatamente ad un certo intervallo di tempo. Alcuni di questi “sassi” vengono risolti mediante ulteriori campionamenti e, naturalmente, test. Potrebbe risultare che i primi cinque elementi conterranno le informazioni di cui abbiamo bisogno e il sesto elemento conterrà solo una riga vuota con script. Succede anche che i blocchi non abbiano alcun identificatore, quindi è possibile puntare direttamente tramite un metodo get(int index)
al numero di posizione dell'elemento in questione.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION