Pergunta

Estou trabalhando em um aplicativo que elimina dados de um site e estava me perguntando como deveria obter os dados. Especificamente, preciso de dados contidos em várias tags de div que usam uma classe CSS específica - atualmente (para fins de teste), estou apenas verificando

div class = "classname"

Em cada linha de HTML - isso funciona, mas não posso deixar de sentir que há uma solução melhor por aí.

Existe alguma maneira agradável em que eu possa dar a uma linha de classe uma linha de HTML e ter alguns métodos legais como:

boolean usesClass(String CSSClassname);
String getText();
String getLink();
Foi útil?

Solução

Vários anos atrás, usei Jtidy para o mesmo objetivo:

http://jtidy.sourceforge.net/

"Jtidy é uma porta Java do HTML Tidy, um verificador de sintaxe HTML e uma bela impressora. Como seu primo não-Java, Jtidy pode ser usado como uma ferramenta para limpar a limpeza malformada e com defeito html. Além disso, Jtidy fornece uma interface dom Documento que está sendo processado, o que efetivamente torna você capaz de usar o JTIDY como um analisador DOM para o HTML do mundo real.

Jtidy foi escrito por Andy Quick, que mais tarde deixou a posição do mantenedor. Agora, Jtidy é mantido por um grupo de voluntários.

Mais informações sobre o JTIDY podem ser encontradas na página do projeto JTIDY Sourceforge. "

Outras dicas

Outra biblioteca que pode ser útil para o processamento HTML é o JSUP. O JSOUP tenta limpar o HTML malformado e permite a análise HTML em Java usando a sintaxe do seletor de tags do jQuery.

http://jsoup.org/

O principal problema, conforme declarado pelos Comuns anteriores, é o HTML malformado; portanto, um limpador html ou um conversor html-xml é uma obrigação. Depois de obter o código XML (xhtml), existem muitas ferramentas para lidar com isso. Você pode obtê-lo com um manipulador de sax simples que extrai apenas os dados necessários ou qualquer método baseado em árvore (DOM, JDOM, etc.) que permitem modificar o código original.

Aqui está um código de amostra que usa Limpador HTML Para obter todas as divs que usam uma determinada classe e imprimem todo o conteúdo de texto dentro dela.

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

/**
 * @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom>
 */
public class TestHtmlParse
{
    static final String className = "tags";
    static final String url = "http://www.stackoverflow.com";

    TagNode rootNode;

    public TestHtmlParse(URL htmlPage) throws IOException
    {
        HtmlCleaner cleaner = new HtmlCleaner();
        rootNode = cleaner.clean(htmlPage);
    }

    List getDivsByClass(String CSSClassname)
    {
        List divList = new ArrayList();

        TagNode divElements[] = rootNode.getElementsByName("div", true);
        for (int i = 0; divElements != null && i < divElements.length; i++)
        {
            String classType = divElements[i].getAttributeByName("class");
            if (classType != null && classType.equals(CSSClassname))
            {
                divList.add(divElements[i]);
            }
        }

        return divList;
    }

    public static void main(String[] args)
    {
        try
        {
            TestHtmlParse thp = new TestHtmlParse(new URL(url));

            List divs = thp.getDivsByClass(className);
            System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***");
            for (Iterator iterator = divs.iterator(); iterator.hasNext();)
            {
                TagNode divElement = (TagNode) iterator.next();
                System.out.println("Text child nodes of DIV: " + divElement.getText().toString());
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

Você pode estar interessado por Tagsoup, um analisador Java HTML capaz de lidar com HTML malformado. Os analisadores XML funcionariam apenas em XHTML bem formado.

O projeto HTMLPARSER (http://htmlparser.sourceforge.net/) pode ser uma possibilidade. Parece ser bastante decente para lidar com HTML malformado. O snippet seguinte deve fazer o que você precisa:

Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);

Jericó: http://jericho.htmlparser.net/docs/index.html

Fácil de usar, suportes HTML não bem formados, muitos exemplos.

Htmlunit pode ser útil. Faz muito mais coisas também.

http://htmlunit.sourceforge.net/1

Não vamos esquecer Jerry, seu jQuery em Java: uma biblioteca Java rápida e concisa que simplifica a análise de documentos HTML, atravessando e manipulando; Inclui o uso de seletores CSS3.

Exemplo:

Jerry doc = jerry(html);
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy");

Exemplo:

doc.form("#myform", new JerryFormHandler() {
    public void onForm(Jerry form, Map<String, String[]> parameters) {
        // process form and parameters
    }
});

Obviamente, esses são apenas alguns exemplos rápidos para sentir como tudo se parece.

The nu.validator project is an excellent, high performance HTML parser that doesn't cut corners correctness-wise.

The Validator.nu HTML Parser is an implementation of the HTML5 parsing algorithm in Java. The parser is designed to work as a drop-in replacement for the XML parser in applications that already support XHTML 1.x content with an XML parser and use SAX, DOM or XOM to interface with the parser. Low-level functionality is provided for applications that wish to perform their own IO and support document.write() with scripting. The parser core compiles on Google Web Toolkit and can be automatically translated into C++. (The C++ translation capability is currently used for porting the parser for use in Gecko.)

You can also use XWiki HTML Cleaner:

It uses HTMLCleaner and extends it to generate valid XHTML 1.1 content.

If your HTML is well-formed, you can easily employ an XML parser to do the job for you... If you're only reading, SAX would be ideal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top