Pregunta

Estoy trabajando en una aplicación que elimina los datos de un sitio web y me preguntaba cómo debería hacer para obtener los datos. Específicamente, necesito datos contenidos en una serie de etiquetas div que utilizan una clase CSS específica. Actualmente (para fines de prueba) solo estoy comprobando

div class = "classname"

en cada línea de HTML: esto funciona, pero no puedo evitar sentir que hay una solución mejor por ahí.

¿Hay alguna forma agradable en la que podría dar a una clase una línea de HTML y tener algunos métodos interesantes como:

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

Solución

Hace varios años usé JTidy para el mismo propósito:

http://jtidy.sourceforge.net/

" JTidy es un puerto Java de HTML Tidy, un comprobador de sintaxis HTML y una impresora bonita. Al igual que su primo que no es Java, JTidy se puede utilizar como una herramienta para limpiar HTML incorrecto y con formato incorrecto. Además, JTidy proporciona una interfaz DOM al documento que se está procesando, lo que efectivamente le permite usar JTidy como un analizador DOM para HTML del mundo real.

JTidy fue escrito por Andy Quick, quien luego se retiró de la posición de mantenedor. Ahora JTidy es mantenido por un grupo de voluntarios.

Puede encontrar más información sobre JTidy en la página del proyecto de JTidy SourceForge. "

Otros consejos

Otra biblioteca que podría ser útil para el procesamiento de HTML es jsoup. Jsoup intenta limpiar HTML con formato incorrecto y permite el análisis html en Java utilizando la sintaxis del selector de etiquetas de jQuery.

http://jsoup.org/

El problema principal como se indica en los comentarios anteriores es un HTML con formato incorrecto, por lo que un limpiador html o un convertidor HTML-XML es una necesidad. Una vez que obtenga el código XML (XHTML), hay muchas herramientas para manejarlo. Puede obtenerlo con un simple controlador SAX que extraiga solo los datos que necesita o cualquier método basado en árbol (DOM, JDOM, etc.) que le permita incluso modificar el código original.

Aquí hay un código de ejemplo que usa HTML cleaner para obtener todos los DIV que usan una determinada clase e imprimir Todo el contenido de texto dentro de él.

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();
        }
    }
}

Puede que te interese TagSoup , un Java Analizador de HTML capaz de manejar HTML mal formado. Los analizadores XML solo funcionarán en XHTML bien formado.

El proyecto HTMLParser ( http://htmlparser.sourceforge.net/ ) puede ser una posibilidad. Parece ser bastante decente en el manejo de HTML mal formado. El siguiente fragmento de código debe hacer lo que necesita:

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

Jericho: http://jericho.htmlparser.net/docs/index.html

Fácil de usar, soporta HTML bien formado, muchos ejemplos.

HTMLUnit podría ser de ayuda. También hace muchas más cosas.

http://htmlunit.sourceforge.net/ 1

No olvidemos Jerry , su jQuery en java: una biblioteca de Java rápida y concisa que simplifica el análisis, desplazamiento y manipulación de documentos HTML; incluye el uso de selectores css3.

Ejemplo:

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

Ejemplo:

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

Por supuesto, estos son solo algunos ejemplos rápidos para tener la sensación de cómo se ve todo.

El proyecto nu.validator es un excelente HTML de alto rendimiento analizador que no corta las esquinas en cuanto a la corrección.

  

El analizador HTML Validator.nu es una implementación del algoritmo de análisis HTML5 en Java. El analizador está diseñado para funcionar como un reemplazo directo del analizador XML en aplicaciones que ya admiten contenido XHTML 1.x con un analizador XML y usa SAX, DOM o XOM para interactuar con el analizador. Se proporciona funcionalidad de bajo nivel para las aplicaciones que deseen realizar su propia IO y admitan document.write () con scripting. El núcleo del analizador se compila en Google Web Toolkit y se puede traducir automáticamente a C ++. (La capacidad de traducción de C ++ se usa actualmente para portar el analizador para su uso en Gecko).

También puedes usar XWiki HTML Cleaner :

Utiliza HTMLCleaner y lo amplía para generar contenido válido de XHTML 1.1.

Si su HTML está bien formado, puede emplear fácilmente un analizador XML para hacer el trabajo por usted ... Si solo está leyendo, SAX sería ideal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top