Ao trabalhar com dados extraídos de páginas web, é essencial analisar o conteúdo HTML e extrair informações específicas. Com Jsoup, essa tarefa se torna significativamante mais simples em comparação com ferramentas anteriores como HtmlParser, que eram complexas e pouco eficientes. O Jsoup oferece uma sintaxe poderosa baseada em seletores CSS (ou até jQuery), permitindo filtrar elementos com precisão e flexibilidade.
Aqui estão os principais métodos utilizados:
1) Jsoup.parse(html) → cria um documento HTML a partir de uma string, retornando um objeto Document.
2) Document.select(selector) → aplica um seletor CSS ou jQuery-style para encontrar todos os elementos correspondentes, retornando um conjunto Elements.
3) Elements.first() → retorna o primeiro elemento do grupo encontrado.
4) Element.text() → extrai o texto contido entre as tags de um elemento. Exemplo:
String html = "<div>Este é um exemplo</div>";
Document doc = Jsoup.parse(html);
doc.select("div").first().text(); // Resultado: "Este é um exemplo"
5) Element.attr(attributeName) → obtém o valor de um atributo específico. Por exemplo:
String html = "<div class='destaque'>Conteúdo</div>";
doc.select("div").first().attr("class"); // Retorna: "destaque"
A seguir, um exemplo prático que demonstra como extrair dados etsruturados de uma página HTML:
public static Map<String, Object> extractData(String htmlContent) {
Map<String, Object> result = new HashMap<>();
Document document = Jsoup.parse(htmlContent);
// Seleciona o primeiro div cujo atributo 'class' começa com 'result_info'
Element container = document.select("div[class^=result_info]").first();
if (container == null) return result;
// Extrai o título da série a partir do h3 dentro do container
Element header = container.select("h3").first();
String title = header.select("a").attr("title").trim();
// Obtém o ano, caso exista
String releaseYear = "";
Elements yearElements = header.select("em");
if (!yearElements.isEmpty()) {
releaseYear = yearElements.first().text().trim();
}
// Coleta a pontuação de avaliações
String rating = "";
Element scoreBlock = container.select("p").first();
if (scoreBlock != null) {
Elements spanTags = scoreBlock.select("span");
for (Element span : spanTags) {
String text = span.text().trim();
text = text.replace("\u00A0", " "); // Substitui por espaço
rating += text;
}
}
// Extração de informações adicionais
Map<String, String> additionalInfo = new HashMap<>();
Elements infoBlocks = container.select("div[class^=result_info_cont]");
int count = 0;
for (Element block : infoBlocks) {
if (count >= 3) break;
StringBuilder valueBuilder = new StringBuilder();
boolean isKey = true;
String key = "";
for (Element child : block.children()) {
if (isKey) {
key = child.text().trim();
if ("Descrição".equals(key)) break;
isKey = false;
} else {
if (child.children().size() > 0) {
for (Element subChild : child.children()) {
valueBuilder.append(subChild.text().trim()).append(",");
}
} else {
valueBuilder.append(child.text().trim()).append(",");
}
}
}
String finalValue = valueBuilder.toString();
if (finalValue.endsWith(",")) {
finalValue = finalValue.substring(0, finalValue.length() - 1);
}
additionalInfo.put(key, finalValue);
count++;
}
result.put("nome", title);
result.put("ano", releaseYear);
result.put("avaliacao", rating);
result.put("informacoes_adicionais", additionalInfo);
return result;
}
Esse código demonstra como usar seletores avançados, navegar pela árvore DOM e manipular valores com segurança. É ideal para scrapers de conteúdo dinâmico, onde os dados são estruturados em HTML com classes bem definidas.
Recursos úteis:
- Documentação Oficial
- Guia Prático no IBM DeveloperWorks
- Sintaxe de Seleotres do Jsoup