2011-01-02 12 views
6

Necesito rozar una página web usando Java y he leído que la expresión regular es una forma bastante ineficiente de hacerlo y uno debe ponerla en un documento DOM para navegarla.Algo de ayuda raspando una página en Java

He intentado leer la documentación, pero parece demasiado extensa y no sé por dónde empezar.

¿Podría mostrarme cómo raspar la tabla this en una matriz? Puedo intentar averiguar mi camino desde allí. Un fragmento/ejemplo también serviría.

Gracias.

Respuesta

7

Puede intentar jsoup: Java HTML Parser. Es una excelente biblioteca con buenos códigos de muestra.

+0

He echado un vistazo a los documentos jSoup y parece bastante bueno. ¡Estaba buscando algo en las líneas de BeautifulSoup para Python y aquí está! –

0

Regex es definitivamente el camino a seguir. Construir un DOM es demasiado complicado y requiere mucho análisis de texto.

4
  1. Transform la página web que está tratando de desechar en un documentoXHTML. Hay varias opciones para hacer esto con Java, como JTidy y HTMLCleaner. Estas herramientas también corregirán automáticamente el formato incorrecto del HTML (p. Ej., Cerrar etiquetas sin cerrar). Ambos funcionan muy bien, pero prefiero JTidy porque se integra mejor con la API DOM de Java;
  2. Extracto requiere información usando expresiones XPath.

Este es un ejemplo de trabajo que utiliza JTidy y la página web que proporcionó, que se utiliza para extraer todos los nombres de archivos de la tabla.

public static void main(String[] args) throws Exception { 
    // Create a new JTidy instance and set options 
    Tidy tidy = new Tidy(); 
    tidy.setXHTML(true); 

    // Parse an HTML page into a DOM document 
    URL url = new URL("http://www.cs.grinnell.edu/~walker/fluency-book/labs/sample-table.html");   
    Document doc = tidy.parseDOM(url.openStream(), System.out); 

    // Use XPath to obtain whatever you want from the (X)HTML 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression expr = xpath.compile("//td[@valign = 'top']/a/text()"); 
    NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET); 
    List<String> filenames = new ArrayList<String>(); 
    for (int i = 0; i < nodes.getLength(); i++) { 
     filenames.add(nodes.item(i).getNodeValue()); 
    } 

    System.out.println(filenames); 
} 

El resultado será [Integer Processing:, Image Processing:, A Photo Album:, Run-time Experiments:, More Run-time Experiments:] como se esperaba.

Otra herramienta genial que puede usar es Web Harvest. Básicamente, hace todo lo que hice arriba pero usa un archivo XML para configurar la canalización de extracción.

+0

Esta es una solución elegante pero exagerada para un simple raspado. Construir una dom de una gran página web será bastante lento (el ejemplo original fue una página pequeña, pero en general la mayoría de las páginas web en la actualidad tienen DOM complicados). – monkjack

0

Si todo lo que hace es arrastrar una tabla a un archivo de datos, regex estará bien, y puede ser incluso mejor que usar un documento DOM. Los documentos DOM consumirán mucha memoria (especialmente para tablas de datos realmente grandes), por lo que probablemente desee un analizador SAX para documentos grandes.

Cuestiones relacionadas