Можливо, коли-небудь вам буде необхідно отримати інформацію з будь-якого сайту або HTML-документа у своєму додатку, і я без зайвих слів скажу, що використання бібліотеки soup спростить ваше завдання. Як мовиться на wiki , súp - це Java-бібліотека з відкритим вихідним кодом, призначена для аналізу, вилучення та управління даними, що зберігаються в документах HTML.
Швидкий старт
Бібліотеку можна завантажити у вигляді jar файлу та помістити в проект, а також підключити за допомогою Maven/Gradle. Посилання на офіційний сайт залишу наприкінці статті: там ви зможете знайти актуальну версію бібліотеки. У прикладі використовуватимемо підключення через Maven. Додамо залежність:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Використання
Насамперед вам необхідно отримати екземпляр класуDocument
з org.jsoup.nodes.Document із зазначенням на джерело для розбору. Їм може бути як локальний файл, і посилання. Для прикладу, в даній статті ми будемо використовувати сайт yandex.ru і спробуємо отримати їх актуальну стрічку новин:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
є ідентифікатором, який повідомляється відвідуваному сайту. На багатьох сайтах він є найважливішим критерієм для антиспам фільтра. Referrer
містить URL-адресау запиту. Метод get()
викликає оброблюваний виняток IOException, тому ми можемо обернути все в try/catch
блок, або просто перекинути його далі за допомогою throws
. На даний момент ми отримали вихідний код цієї сторінки. При необхідності бібліотека soup сама може відновити пошкоджені елементи. Тепер нам залишається лише звузити пошук до окремого блоку. Методselect()
має велику вибірку у використанні: він дозволяє шукати елементи за тегом, атрибутами, класом та іншими параметрами. Багато сучасних браузери підтримують можливість швидкого пошуку вихідного коду обраного елемента. Нехитрими маніпуляціями ми знаходимо вихідний код потрібного нам елемента і отримуємо div
блок із зазначеним класом, його ми і будемо використовувати для вибірки. Скористайтеся класом Elements
з org.jsoup.select.Elements для вибору всіх елементів з нашого вибраного блоку.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Зараз ми маємо щось на зразок цього: Тепер нам залишається лише використовувати невеликий цикл для пробору всіх елементів:
for (Element element : listNews.select("a"))
System.out.println(element.text());
Метод text()
дозволяє відкинути код розмітки та залишає лише поєднання тексту для всіх вхідних елементів. Результат виконання буде такий: Неважко помітити, що реальна кількість отриманих рядків не відповідає фактичному відображенню на сторінці. У цьому й полягають підводні камені. Якщо подивитися вихідний код розмітки, можна помітити, що остання новина змінюється анімаційно з певним інтервалом часу. Частина таких "камінців" вирішується додатковою вибіркою, і тестами. Може виявитися так, що перші п'ять елементів будуть містити потрібну нам інформацію, а на шостому елементі буде лише порожній рядок, що заскриптується. Буває і таке, що блоки не володітимуть будь-якими ідентифікаторами, тоді є можливість прямо вказати за допомогою методуget(int index)
на номер позиції елемента, що розглядається.
System.out.println(listNews.select("a").get(2).text());
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ