Jsoup —— Utilizando Java para Analisar Conteúdo HTML

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 &nbsp; 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

Tags: java Jsoup HTML Parsing CSS selector web scraping

Publicado em 8-8 19:35