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.