2008-10-26 21 views
50

Estoy trabajando en una aplicación que raspa los datos de un sitio web y me preguntaba cómo debería obtener los datos. Específicamente necesito datos contenidos en una serie de etiquetas div que utilizan una clase CSS específica - Actualmente (para propósitos de prueba) Sólo estoy comprobandoJava HTML Parsing

div class = "classname" 

en cada línea de HTML - Esto funciona, pero no puedo' Ayuda, pero siento que hay una mejor solución por ahí.

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

boolean usesClass(String CSSClassname); 
String getText(); 
String getLink(); 
+1

Relacionado: [¿Cuáles son los pros y los contras de los principales analizadores de HTML de Java?] (Http://stackoverflow.com/questions/3152138/what-are-the-pros-and-cons-of-the-leading -java-html-parsers) – BalusC

Respuesta

18

varios años he usado JTidy para el mismo propósito:.

http://jtidy.sourceforge.net/

"JTidy es un puerto de Java de HTML Tidy, un comprobador de sintaxis HTML y una impresora bastante igual que su no Java primo, JTidy se puede utilizar como una herramienta para limpiar HTML mal formado y defectuoso. Además, JTidy proporciona una interfaz DOM para el documento que se está procesando, lo que hace que puedas utilizar JTidy como un analizador DOM para HTML del mundo real.

JTidy fue escrito por Andy Quick, quien más tarde renunció al puesto de mantenedor. Ahora JTidy es mantenido por un grupo de voluntarios. ...

Más información sobre JTidy se puede encontrar en la página del proyecto JTidy SourceForge"

+2

Tristemente jtidy es lento y lento. – PlexQ

+0

JTidy parece un proyecto abandonado, no se ha actualizado desde hace unos años. – rlegendi

0

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

+2

Si su HTML está bien formado. ¿Alguna vez? – PlexQ

+2

¿Por qué no sería? – Yuval

+0

porque trabajo en proyectos con otras personas, algunos de los cuales son diseñadores que no crean HTML perfecto, y muchos otros tampoco, doblemente cuando se usa la tentación. – PlexQ

13

Puede que le interese TagSoup, un analizador HTML de Java capaz de manejar HTML mal formado. Los analizadores XML solo funcionarían en XHTML bien formado.

5

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

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

El principal problema según lo declarado por anteriores comentarios es incorrecto HTML, por lo que un limpiador convertidor HTML o XML HTML es una necesidad. Una vez que obtiene el código XML (XHTML), hay muchas herramientas para manejarlo. Puede obtenerlo con un simple controlador de SAX que extrae 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 muestra que usa HTML cleaner para obtener todos los DIV que usan cierta clase e imprimen todo el contenido de texto dentro de ella. Hace

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

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

http://jsoup.org/

+0

Jsoup es el mejor –

+0

¿Hay algún método sin tener que recurrir a un contenedor externo? – Futuregeek

+1

@Futuregeek Solía ​​usar expresiones regulares, hasta que leí [esta respuesta] (https://stackoverflow.com/a/1732454/5484609) –

3

nu.validator El proyecto es un excelente analizador de HTML y de alto rendimiento que no corta esquinas corrección se refiere.

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

4

No olvidemos Jerry, su jQuery en java: una biblioteca Java rápida y concisa que simplifica el análisis, el recorrido y la 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 sólo algunos ejemplos rápidos para conseguir la sensación de cómo todo se parece.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales del responda aquí y proporcione el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Brian

+1

Gracias, ejemplo agregado. No he visto ejemplos en la mayoría de los otros comentarios, así que seguí el mismo patrón. – igr

+0

No hay problema. Apareció en la cola de baja calidad. Mi comentario está automatizado por SO. – Brian