2011-01-02 6 views
6

Ho bisogno di raschiare una pagina web usando Java e ho letto che la regex è un modo piuttosto inefficiente di farlo e uno dovrebbe metterlo in un documento DOM per spostarlo.Alcuni aiutano a scansionare una pagina in Java

Ho provato a leggere la documentazione ma sembra troppo estesa e non so da dove cominciare.

Potresti mostrarmi come raschiare la tabella this in una matrice? Posso provare a capire la mia strada da lì. Un esempio di snippet andrebbe benissimo.

Grazie.

risposta

7

Si può provare jsoup: Java HTML Parser. È una libreria eccellente con buoni codici di esempio.

+0

Ho dato un'occhiata ai documenti di jSoup e sembra dannatamente buono. Stavo cercando qualcosa sulle linee di BeautifulSoup per Python ed eccolo qui! –

0

Regex è sicuramente la strada da percorrere. Costruire un DOM è eccessivamente complicato e richiede di per sé molte analisi del testo.

4
  1. Trasforma la pagina web che si sta tentando di rottami in un documentoXHTML. Ci sono diverse opzioni per fare questo con Java, come JTidy e HTMLCleaner. Questi strumenti correggono automaticamente anche HTML malformato (ad es. Chiudi tag non chiusi). Entrambi funzionano molto bene, ma preferisco JTidy perché si integra meglio con l'API DOM di Java;
  2. Estratto informazioni richieste utilizzando le espressioni XPath.

Ecco un esempio di lavoro che utilizza JTidy e la pagina Web fornita, utilizzata per estrarre tutti i nomi di file dalla tabella.

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

Il risultato sarà [Integer Processing:, Image Processing:, A Photo Album:, Run-time Experiments:, More Run-time Experiments:] come previsto.

Un altro strumento interessante che è possibile utilizzare è Web Harvest. Fondamentalmente fa tutto ciò che ho fatto sopra ma usando un file XML per configurare la pipeline di estrazione.

+0

Questa è una soluzione elegante ma eccessiva per alcuni semplici raschiatura. Costruire una dom di una grande pagina web sarà piuttosto lento (l'esempio originale era una piccola pagina, ma in generale la maggior parte delle pagine web in questi giorni ha DOM complicati). – monkjack

0

Se tutto ciò che si sta facendo è raschiare una tabella in un file di dati, l'espressione regolare andrà bene, e potrebbe anche essere migliore rispetto all'utilizzo di un documento DOM. I documenti DOM consumeranno molta memoria (specialmente per tabelle di dati veramente grandi), quindi probabilmente vorrai un parser SAX per documenti di grandi dimensioni.

Problemi correlati