Być może pewnego dnia będziesz musiał pobrać informacje ze strony internetowej lub dokumentu HTML w swojej aplikacji i bez zbędnych ceregieli powiem, że korzystanie z biblioteki jsoup znacznie uprości Twoje zadanie. Według wiki jsoup to biblioteka Java typu open source przeznaczona do analizowania, wyodrębniania i manipulowania danymi przechowywanymi w dokumentach HTML.
Szybki start
Bibliotekę można pobrać jako plik jar i umieścić w projekcie lub połączyć za pomocą Maven/Gradle. Na końcu artykułu zostawię link do oficjalnej strony internetowej: tam znajdziesz aktualną wersję biblioteki. W przykładzie wykorzystamy połączenie poprzez Maven. Dodajmy zależność:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Stosowanie
Przede wszystkim musisz pobrać instancję klasyDocument
z org.jsoup.nodes.Document wskazując źródło do analizy. Może to być plik lokalny lub łącze. Na przykład w tym artykule skorzystamy ze strony internetowej yandex.ru i spróbujemy uzyskać ich aktualny kanał informacyjny:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
to identyfikator przekazywany odwiedzanej witrynie. W wielu witrynach jest to najważniejsze kryterium filtra antyspamowego. Referrer
zawiera adres URL źródła żądania. Metoda get()
zgłasza obsługiwany wyjątek IOException, dzięki czemu możemy zawinąć wszystko w try/catch
blok lub po prostu rzucić dalej za pomocą throws
. Otrzymaliśmy już kod źródłowy tej strony. W razie potrzeby sama biblioteka jsoup może przywrócić uszkodzone elementy. Teraz wystarczy zawęzić wyszukiwanie do osobnego bloku. Metoda select()
ma duży wybór zastosowań: pozwala wyszukiwać elementy po tagu, atrybutach, klasie i innych parametrach. Prawie wszystkie współczesne przeglądarki obsługują możliwość szybkiego wyszukiwania kodu źródłowego wybranego elementu. Za pomocą prostych manipulacji znajdujemy kod źródłowy potrzebnego nam elementu i otrzymujemy div
blok z określoną klasą, którego użyjemy do próbkowania. Użyjmy klasy Elements
z org.jsoup.select.Elements, aby wybrać wszystkie elementy z wybranego przez nas bloku.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Teraz mamy coś takiego: Teraz jedyne, co musimy zrobić, to użyć małej pętli, aby iterować po wszystkich elementach:
for (Element element : listNews.select("a"))
System.out.println(element.text());
Metoda text()
pozwala odrzucić kod znaczników i pozostawia jedynie kombinację tekstu dla wszystkich przychodzących elementów. Wynik wykonania będzie następujący: Łatwo zauważyć, że rzeczywista liczba otrzymanych wierszy nie odpowiada faktycznemu wyświetleniu na stronie. Tu właśnie kryją się pułapki. Jeśli spojrzysz na kod źródłowy znaczników, zauważysz, że najnowsze wiadomości zmieniają się w sposób animowany w określonych odstępach czasu. Niektóre z tych „kamieni” rozwiązuje się poprzez dodatkowe pobieranie próbek i oczywiście testy. Może się okazać, że pierwszych pięć elementów będzie zawierało potrzebne nam informacje, a szósty element będzie zawierał jedynie zapisaną w skrypcie pustą linię. Zdarza się również, że bloki nie będą miały żadnych identyfikatorów, wtedy można bezpośrednio wskazać metodą get(int index)
numer pozycji danego elementu.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION