22 september, 2011

En hyllning!

Ibland springer man på ramverk (stora som små) som gör precis det man vill utan att vara i vägen. Jsoup är ett sådant.

Jsoup är en HTML-parser (Java-bibliotek) med stöd för CSS-selector syntax för att söka ut element i det parsade DOM-trädet. I mitt nuvarande uppdrag behöver jag jobba en hel del med screen-scraping av andra webbsajter och JSoup gör jobbet enkelt för mig. För att hämta ut länkar från en sajt (och göra länkarna absoluta):

try {
    Document htmlDoc = Jsoup.connect("http://www.google.se").timeout(2000).get();
    Elements advertiseLinks = htmlDoc.select("#fll > a");
    for(Element element : advertiseLinks){
       String absoluteHref = element.absUrl("href");
       String text = element.text();
       System.out.println(String.format("href: %s, text: %s", absoluteHref, text));
    }
} catch (IOException ex) {
            // Ignore right now
}

// Skriver ut:
// href: http://www.google.se/intl/sv/ads/, text: Annonsera med Google
// href: http://www.google.se/services/, text: Företagslösningar
// href: http://www.google.se/intl/sv/about.html, text: Allt om Google
// href: http://www.google.com/ncr, text: Google.com in English

I exemplet hämtas länkarna från google.se (de som finns i den div med id 'fll') och görs absoluta, svårare än såhär är det inte. En vinnnade kombination är Jsoup och Firebug till Firefox.

Förutom screen-scaping kan Jsoup användas för att tvätta html som hämtas från en annan sajt (RSS eller liknande) eller matas in av en användare. Även detta löser Jsoup med bravur genom användandet av s.k. Whitelist's. Det finns ett antal färdiga Whitelists som kan användas, från restriktiva till avslappnad säkerhetsnivå. Rensning av html ser ut på följande sätt: (kod från jsoup.org)

String unsafe = "Link";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: Link

Detta var bara en mycket ytlig översikt av detta mycket imponerande ramverk kan göra. Om Ni någonsin behöver jobba med HTML i en Java-applikation så vet ni vilket verktyg ni skall använda :-)

Inga kommentarer:

Skicka en kommentar