JavaRush /Java блог /Random UA /Легкий парсинг HTML за допомогою jsoup
Stanislav
21 рівень
Москва

Легкий парсинг HTML за допомогою jsoup

Стаття з групи Random UA
Можливо, коли-небудь вам буде необхідно отримати інформацію з будь-якого сайту або 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блок із зазначеним класом, його ми і будемо використовувати для вибірки. Легкий парсинг HTML за допомогою soup - 1Скористайтеся класом Elementsз org.jsoup.select.Elements для вибору всіх елементів з нашого вибраного блоку.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Зараз ми маємо щось на зразок цього: Легкий парсинг HTML за допомогою soup - 2Тепер нам залишається лише використовувати невеликий цикл для пробору всіх елементів:
for (Element element : listNews.select("a"))
            System.out.println(element.text());
Метод text()дозволяє відкинути код розмітки та залишає лише поєднання тексту для всіх вхідних елементів. Результат виконання буде такий: Легкий парсинг HTML за допомогою soup - 3Неважко помітити, що реальна кількість отриманих рядків не відповідає фактичному відображенню на сторінці. У цьому й полягають підводні камені. Якщо подивитися вихідний код розмітки, можна помітити, що остання новина змінюється анімаційно з певним інтервалом часу. Частина таких "камінців" вирішується додатковою вибіркою, і тестами. Може виявитися так, що перші п'ять елементів будуть містити потрібну нам інформацію, а на шостому елементі буде лише порожній рядок, що заскриптується. Буває і таке, що блоки не володітимуть будь-якими ідентифікаторами, тоді є можливість прямо вказати за допомогою методуget(int index)на номер позиції елемента, що розглядається.
System.out.println(listNews.select("a").get(2).text());

Висновок

У цьому прикладі показана лише мала частина того, на що здатний soup. Не варто скасовувати той факт, що сайти нерідко оновлюються, змінюючи структуру коду розмітки, так що при роботі з парсингом потрібно бути готовим адаптуватися до змін. Більше інформації та актуальну версію ви можете отримати на офіційному сайті soup.org , детальніше почитати про класи та методи можна за посиланням o7planning.org . Залишу посилання на мій github , на момент написання статті там знаходиться кілька Telegram-ботів, які використовують Soup для отримання та видачі інформації.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ