Talvez algum dia você precise obter informações de um site ou documento HTML em seu aplicativo, e direi sem mais delongas que usar a biblioteca jsoup simplificará bastante sua tarefa. De acordo com o wiki , jsoup é uma biblioteca Java de código aberto projetada para analisar, extrair e manipular dados armazenados em documentos HTML.
Início rápido
A biblioteca pode ser baixada como um arquivo jar e colocada em um projeto ou conectada usando Maven/Gradle. Vou deixar um link para o site oficial no final do artigo: lá você encontra a versão atual da biblioteca. No exemplo usaremos conexão via Maven. Vamos adicionar uma dependência:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Uso
Primeiro de tudo, você precisa obter uma instância da classeDocument
em org.jsoup.nodes.Document indicando a fonte para análise. Pode ser um arquivo local ou um link. Por exemplo, neste artigo usaremos o site yandex.ru e tentaremos obter o feed de notícias atual:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
é um identificador que é comunicado ao site que está sendo visitado. Em muitos sites é o critério mais importante para o filtro antispam. Referrer
contém o URL da origem da solicitação. O método get()
lança uma IOException manipulada, para que possamos agrupar tudo em try/catch
um bloco ou simplesmente lançá-lo ainda mais com throws
. Agora recebemos o código-fonte desta página. Se necessário, a própria biblioteca jsoup pode restaurar elementos danificados. Agora tudo o que precisamos fazer é restringir a pesquisa a um bloco separado. O método select()
possui uma grande variedade de utilizações: permite pesquisar elementos por tag, atributos, classe e outros parâmetros. Quase todos os navegadores modernos suportam a capacidade de pesquisar rapidamente o código-fonte de um elemento selecionado. Com manipulações simples, encontramos o código-fonte do elemento que precisamos e obtemos div
um bloco com a classe especificada, que usaremos para amostragem. Vamos usar a classe Elements
org.jsoup.select.Elements para selecionar todos os elementos do nosso bloco selecionado.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Agora temos algo assim: Agora tudo o que precisamos fazer é usar um pequeno loop para iterar por todos os elementos:
for (Element element : listNews.select("a"))
System.out.println(element.text());
O método text()
permite descartar o código de marcação e deixa apenas uma combinação de texto para todos os elementos recebidos. O resultado da execução será o seguinte: É fácil perceber que o número real de linhas recebidas não corresponde ao real exibido na página. É aqui que residem as armadilhas. Se você observar o código-fonte da marcação, notará que as últimas notícias mudam animadamente em um determinado intervalo de tempo. Algumas dessas “pedras” são resolvidas por amostragem adicional e, claro, testes. Pode acontecer que os primeiros cinco elementos contenham as informações que precisamos e o sexto elemento contenha apenas uma linha vazia com script. Acontece também que os blocos não terão identificadores, então é possível apontar diretamente através de um método get(int index)
para o número da posição do elemento em questão.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION