2011-01-02 11 views
6

Potrzebuję zeskanować stronę przy użyciu Javy i przeczytałem, że wyrażenie to jest dość nieefektywnym sposobem na zrobienie tego i należy umieścić go w dokumencie DOM, aby móc nim nawigować.Trochę pomocy przy skrobaniu strony w Javie

Próbowałem przeczytać dokumentację, ale wydaje mi się, że jest zbyt obszerna i nie wiem od czego zacząć.

Czy możesz pokazać mi, jak zeskrobać tabelę w tabeli this? Mogę spróbować dowiedzieć się z mojej strony. Fragment/przykład też byłby w porządku.

Dzięki.

Odpowiedz

7

Możesz spróbować jsoup: Java HTML Parser. Jest to doskonała biblioteka z dobrymi kodami próbek.

+0

Spojrzałem na dokumenty jSoup i wygląda całkiem nieźle. Szukałem czegoś na linii BeautifulSoup for Python i oto jest! –

0

Regex to zdecydowanie najlepsza droga. Budowanie DOM jest zbyt skomplikowane i samo w sobie wymaga dużego parsowania tekstu.

4
  1. Transform stronę internetową, którą próbujesz się na złom XHTML dokumentu. Jest kilka opcji, aby to zrobić z Javą, takimi jak JTidy i HTMLCleaner . Te narzędzia automatycznie naprawią zniekształcony kod HTML (np. Zamknij niezamknięte znaczniki). Oba działają bardzo dobrze, ale ja wolę JTidy, ponieważ lepiej integruje się z DOM API Javy;
  2. Wymagane informacje za pomocą wyrażeń XPath.

Oto przykład działający przy użyciu JTidy i podanej strony internetowej, używany do wyodrębnienia wszystkich nazw plików z tabeli.

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

Wynik będzie zgodny z oczekiwaniami [Integer Processing:, Image Processing:, A Photo Album:, Run-time Experiments:, More Run-time Experiments:].

Kolejnym fajnym narzędziem, które można użyć, jest Web Harvest. Zasadniczo robi to wszystko, co zrobiłem powyżej, ale używając pliku XML do skonfigurowania potoku wyciągu.

+0

Jest to eleganckie rozwiązanie, ale przesada dla niektórych prostych skrobanie. Budowa domeny dużej strony internetowej będzie dość powolna (pierwotnym przykładem była mała strona, ale ogólnie większość stron internetowych ma skomplikowane DOM). – monkjack

0

Jeśli wszystko, co robisz, polega na skrobaniu tabeli w pliku danych, wyrażenie regularne będzie w porządku i może być nawet lepsze niż w przypadku dokumentu DOM. Dokumenty DOM zużywają dużo pamięci (szczególnie w przypadku bardzo dużych tabel danych), więc prawdopodobnie potrzebujesz parsera SAX dla dużych dokumentów.

Powiązane problemy