Анализ и извлечение HTML с помощью Jsoup

Jsoup для HTML то же, что XML-парсеры для XML. Jsoup разбирает HTML. Его синтаксис селекторов jquery очень прост в использовании и очень гибок для получения желаемого результата.

1. Введение в Jsoup

jsoup реализует спецификацию WHATWG HTML5 и анализирует HTML в ту же DOM, что и современные браузеры.

  • Он извлекает и анализирует HTML из URL, файла или строки.
  • находит и извлекает данные, используя обход DOM или селекторы CSS
  • манипулирует элементами HTML, атрибутами и текстом
  • очищает отправленный пользователем контент по безопасному белому списку для предотвращения атак XSS
  • выводит аккуратный HTML

2. Зависимости Maven

Мы можем включить Jsoup в наш проект, используя его последнюю версию из репозитория maven.

 <зависимость><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><версия>1.15.2</версия></зависимость>

3. Основные классы

Хотя в библиотеке Jsoup есть много классов, но в основном вы будете иметь дело с нижеприведенными тремя классами. Давайте рассмотрим их

3.1. org.jsoup.Jsoup

Это точка входа для использования Jsoup, предоставляющая методы для загрузки и анализа HTML-документов из различных источников.

Ниже приведены некоторые важные методы класса Jsoup:

  • статическое соединение connect(String url): создает и возвращает соединение URL.
  • static Document parse(File in, String charsetName): анализирует указанный файл с набором символов в документе.
  • static Document parse(String html): анализирует указанный HTML-код в документе.
  • static String clean(String bodyHtml, Whitelist whitelist): возвращает безопасный HTML из входного HTML, анализируя входной HTML и фильтруя его по белому списку разрешенных тегов и атрибутов.

3.2.org.jsoup.nodes.Document

Этот класс представляет собой HTML-документ, загруженный через библиотеку Jsoup. Вы можете использовать этот класс для выполнения операций, которые должны быть применимы ко всему HTML-документу.

3.3.org.jsoup.nodes.Элемент

Как вы знаете, элемент HTML состоит из имени тега, атрибутов и дочерних узлов. Используя класс Element, вы можете извлекать данные, проходить по графу узлов и манипулировать HTML.

4. Загрузка HTML-документа

4.1. Из URL-адреса

Используйте метод Jsoup.connect() для загрузки HTML из URL.

Document document = Jsoup.connect("//howtodoinjava.com").get();

4.2 Из файла

Передайте путь к файлу методу Jsoup.parse() для загрузки HTML из файла.

Document document = Jsoup.parse( new File( "c:/temp/demo.html" ) , "utf-8" );

4.3. Загрузка документа из строки

Jsoup.parse() также может загружать HTML из строки.

String html = "<html><head><title>First parse</title></head>"+ "<body><p>Parsed HTML into a doc.</p></body></html>";Document document = Jsoup.parse(html);

5. Извлечение информации из HTML

5.1. Получить заголовок из HTML

Метод document.title() для получения заголовка HTML-страницы.

Document document = Jsoup.parse( ... );System.out.println( document.title() );

5.2. Получить фавикон

Предполагая, что изображение значка будет первым изображением в разделе <head> HTML-документа, мы можем использовать приведенный ниже код.

Document document = Jsoup.parse(...);Element element = document.head().select("link[href~=.*\\.(ico|png)]").first();if(element == null){element = document.head().select("meta[itemprop=image]").first();if(element != null){favImage = element.attr("content");}}else{favImage = element.attr("href");}

5.3. Получить все ссылки

Чтобы получить все ссылки, присутствующие на веб-странице, используйте приведенный ниже код.

Document document = Jsoup.parse(...);Elements links = document.select("a[href]");for(Element link : links){System.out.println("link : " + link.attr("href"));System.out.println("text : " + link.text());}

5.4 Получить все изображения

Чтобы отобразить все изображения на веб-странице, используйте приведенный ниже код.

Document document = Jsoup.parse(...);Elements images = document.select("img[src~=(?i)\\.(png|jpe?g|gif)]");for(Element image : images){System.out.println("src : " + image.attr("src"));System.out.println("height : " + image.attr("height"));System.out.println("width : " + image.attr("width"));System.out.println("alt : " + image.attr("alt"));}

5.5. Получить метаданные URL

Метаинформация состоит из того, что поисковые системы, такие как Google, используют для определения содержимого веб-страницы для индексации. Они присутствуют в виде некоторых тегов в разделе HEAD. Чтобы получить метаинформацию о веб-странице, используйте следующий код.

Document document = Jsoup.parse(...);String description = document.select("meta[name=description]").get(0).attr("content");System.out.println("Meta description : " + description);String keywords = document.select("meta[name=keywords]").first().attr("content");System.out.println("Meta keyword : " + keywords); 

5.6. Получить атрибуты формы

Получение элементов ввода формы на веб-странице очень просто. Найдите элемент FORM, используя уникальный идентификатор; а затем найдите все элементы INPUT, присутствующие в этой форме.

Document doc = Jsoup.parse(...);Element formElement = doc.getElementById("loginForm");Elements inputElements = formElement.getElementsByTag("input");for(Element inputElement : inputElements) {String key = inputElement.attr("name");String value = inputElement.attr("value");System.out.println("Param name: "+key+" \nParam value: "+value);} 

5.7. Обновление атрибутов/контента HTML

Как только мы нашли нужный элемент, используя вышеуказанные подходы; мы можем использовать API Jsoup для обновления атрибутов или innerHTML этих элементов. Например, я хочу обновить все ссылки с «rel=nofollow», присутствующие внутри документа.

Document document = Jsoup.parse(...);Elements links = document.select("a[href]");links.attr("rel", "nofollow");

5.8. Очистка ненадежного HTML(для предотвращения XSS)

Предположим, что ваше приложение хочет отображать фрагменты HTML, отправленные пользователями. Например, пользователи могут помещать HTML-контент в поле комментариев. Это может привести к очень серьезной проблеме, если вы разрешили отображать этот HTML напрямую, предварительно очистив его. Пользователи могут поместить в него вредоносный скрипт и перенаправить ваших пользователей на другой грязный веб-сайт.

Для очистки этого HTML Jsoup предоставляет метод Jsoup.clean(). Этот метод ожидает HTML-контент в виде строки и возвращает чистый HTML. Для выполнения очистки Jsoup использует санитайзер белого списка. Санитайзер белого списка jsoup работает, анализируя входной HTML(в безопасной изолированной среде), а затем проходя по дереву синтаксического анализа и пропуская в очищенный вывод только заведомо безопасные теги и атрибуты(и значения).

Он не использует регулярные выражения, которые не подходят для этой задачи.

Очиститель полезен для предотвращения XSS и ограничения диапазона элементов, которые может предоставить пользователь: вас могут устроить текстовые привязки и сильные элементы, но не структурные элементы div или таблицы.

String dirtyHTML = "<p><a href='//howtodoinjava.com/' onclick='sendCookiesToMe()'>Link</a></p>";String cleanHTML = Jsoup.clean(dirtyHTML, Whitelist.basic());System.out.println(cleanHTML);Output:<p><a href="//howtodoinjava.com/" rel="nofollow">Link</a></p>

6. Заключение

В этом уроке Java мы изучили основы библиотеки Jsoup, которая используется как HTML-парсер. Мы проверили, как загружать HTML-документы и как извлекать определенную информацию из HTML.

Прокрутить вверх