HTML это ядро WEB, все интернет-страницы которые Вы видите, являются ли они динамически сгенерированы средствами JavaScript, JSP, PHP, ASP или другими веб-технологиями, основаны на HTML. На самом деле, Ваш браузер разбирает HTML и отображает его в удобном для Вас виде. Но что делать если Вам нужно разобрать HTML-документ и найти в нем некоторый элемент, тэг, атрибут или проверить существует или нет конкретный элемент при помощи программы на Java.
Если бы Вы были Java программистом уже несколько лет, я уверен, Вы бы сделали XML разбор используя парсеры вроде DOM или SAX. Но, по иронии судьбы, бывают случаи, когда Вам необходимо разобрать HTML-документ из базового Java приложения, которое не содержит Servlet и другие Java веб-технологии. Более того, Core JDK также не содержит HTTP или HTML библиотек. Вот почему, когда дело доходит до разбора HTML файла, многие Java программисты спрашивают у Google, как получить значение HTML-тэга в Java.
Когда я столкнулся с этим, я был уверен что решением будет open-source библиотека, осуществляющая нужную мне функциональность, но я не знал, что она будет такой замечательной и многофункциональной как Jsoup. Она не только обеспечивает поддержку чтения и разбора HTML файлов, атрибутов, CSS классов в стиле JQuery, но и в то же время, позволяет модифицировать их. Используя Jsoup Вы можете сделать с HTML документом все что угодно.
В этой статье мы будем разбирать HTML файл и находить названия и атрибуты тэгов. Также мы разберем примеры скачивания и разбора HTML из файла и любого URL-адреса, например домашнюю страницу Google.
Что такое Jsoup
Jsoup это open-source Java библиотека для работы с реальным HTML. Она обеспечивает очень удобный API для извлечения и манипулирования данными, используя лучшие DOM, CSS, и JQuery-подобные методы. Jsoup реализует WHATWG HTML5 спецификацию, и разбирает HTML в ту же модель DOM, как это делают современные браузер вроде Chrome и Firefox.
Вот некоторые из полезных функций Jsoup библиотеки:
Jsoup может очистить и разобрать HTML из URL, файла или строки.
Jsoup может найти и извлечь данные используя обход DOM или CSS селекторы.
Jsoup позволяет манипулировать HTML элементами, атрибутами и текстом.
Jsoup обеспечивает очистку предоставленной пользователем информации по white-list, для предотвращения XSS атак.
Также Jsoup выдает "аккуратный" HTML.
Jsoup предназначен для работы с различными видами HTML существующими в реальном мире, включая должным образом подтвержденный HTML c неполным неподтвержденным набором тэгов. Одно из основных преимуществ Jsoup это его надежность.
Разбор HTML в Java используя Jsoup
В этом учебнике мы увидим три различных примера разбора и обхода HTML-документа в Java используя Jsoup. В первом примере, мы будем разбирать HTML строку, содержащую тэги, в форме строкового литерала Java. Во втором примере, мы скачаем наш HTML-документ из интернет, и в третьем примере, мы загрузим для разбора наш собственный образец HTML файла login.html. Этот файл — образец HTML документа, который состоит из тэга "title" и тэга "div" в секции "body", который содержит HTML форму. В форме находятся поля для ввода имени пользователя и пароля, а также кнопки сброса и подтверждения для дальнейших действий. Это "правильный" HTML, который может пройти проверку на «валидность», то есть все тэги и атрибуты правильно закрыты. Вот как выглядит наш HTML файл:
С помощью Jsoup очень просто разобрать HTML, все что Вам нужно это вызвать статический метод Jsoup.parse() и передать в него Вашу HTML строку. Jsoup предоставляет несколько перегруженных методов parse() для чтения HTML из строки, файла, из базового URI, из URL и из InputStream. Вы также можете указать кодировку, для корректного чтения HTML файла, в случае если он не в формате "UTF-8".
Метод parse(String html) разбирает входящий HTML в новый объект Document. В Jsoup класс Document наследует класс Element, который расширяет класс Node. Также от класса Node наследуется класс TextNode. До тех пор, пока Вы передаете в метод строку отличную от null, Вы гарантированно имеете успешный, осмысленный разбор, объект Document содержащий (по крайней мере) элементы "head" и "body". Если у Вас есть объект Document, Вы можете получить желаемые данные вызвав соответствующие методы класса Document и его родителей Element и Node.
Java программа для разбора HTML документа
Вот наша полная программа для разбора HTML-строки, HTML-файла, скачанного из интернет и локального HTML файла. Для ее запуска Вы можете использовать IDE (Eclipse или любую другую) или командную строку. В Eclipse это очень легко, просто скопируйте этот код, создайте новый Java проект, щелкните правой кнопкой мыши по папке "src" и вставьте скопированный код (paste). Eclipse позаботится о создании надлежащего пакета и файла исходного кода с соответствующим именем, так гораздо меньше работы. Если у Вас уже есть Java проект, тогда это всего один шаг. Расположенная ниже программа иллюстрирует три примера разбора и обхода HTML файла. В первом примере, мы непосредственно разбираем строку, содержащую HTML, во втором HTML-файл скачанный из URL, в третьем мы загружаем и разбираем HTML-документ из локальной файловой системы.
import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
/**
* Java Program to parse/read HTML documents from File using Jsoup library.
* Jsoup is an open source library which allows Java developer to parse HTML
* files and extract elements, manipulate data, change style using DOM, CSS and
* JQuery like method.
*
* @author Javin Paul
*/
public class HTMLParser{
public static void main(String args[]) {
// Parse HTML String using JSoup library
String HTMLSTring = "<!DOCTYPE html>"
+ "<html>"
+ "<head>"
+ "<title>JSoup Example</title>"
+ "</head>"
+ "<body>"
+ "<table><tr><td><h1>HelloWorld</h1></tr>"
+ "</table>"
+ "</body>"
+ "</html>";
Document html = Jsoup.parse(HTMLSTring);
String title = html.title();
String h1 = html.body().getElementsByTag("h1").text();
System.out.println("Input HTML String to JSoup :" + HTMLSTring);
System.out.println("After parsing, Title : " + title);
System.out.println("Afte parsing, Heading : " + h1);
// JSoup Example 2 - Reading HTML page from URL
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
title = doc.title();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Jsoup Can read HTML page from URL, title : " + title);
// JSoup Example 3 - Parsing an HTML file in Java
//Document htmlFile = Jsoup.parse("login.html", "ISO-8859-1"); // wrong
Document htmlFile = null;
try {
htmlFile = Jsoup.parse(new File("login.html"), "ISO-8859-1");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // right
title = htmlFile.title();
Element div = htmlFile.getElementById("login");
String cssClass = div.className(); // getting class form HTML element
System.out.println("Jsoup can also parse HTML file directly");
System.out.println("title : " + title);
System.out.println("class of div tag : " + cssClass);
}
}
Output:
Input HTML String to JSoup :<!DOCTYPE html><html><head><title>JSoup Example</title></head><body><table><tr><td><h1>HelloWorld</h1></tr></table></body></html>
After parsing, Title : JSoup Example
Afte parsing, Heading : HelloWorld
Jsoup Can read HTML page from URL, title : Google
Jsoup can also parse HTML file directly
title : Login Page
class of div tag : simple
Jsoup HTML парсер будет прилагать все усилия, для создания "чистого" разбора, предоставленного Вами HTML, независимо от того, правильно он сформирован или нет. Он может обрабатывать следующие ошибки:
незакрытые тэги. Например, <p>Java <p>Scala to <p>Java</p> <p>Scala</p>
подразумеваемые тэги. Например, открытые <td>Java is Great</td> будут обернуты в <table><tr><td>
Jsoup создает надежные структуры документа (HTML содержит head и body, при этом в body только соответствующие элементы)
Jsoup является отличной и надежной open-source библиотекой, которая делает чтение html документа, фрагментов body, html строк и непосредственный разбор html содержимого веб, очень простым.
"Jsoup предназначен для работы с различными видами HTML существующими в реальном мире, включая должным образом подтвержденный HTML c неполным неподтвержденным набором тэгов."
И как я должен это понять
Ну вот, нужно изучить основы HTML и CSS, знать, что такое теги, классы, ид, селекторы) одна технология тянет за собой другую, а там уже и JS надо понимать, DOM, и вообще как сайты сделаны)
На сайте html academy можно ознакомится со всем эти хозяйством за 3 месяца примерно, но если прям по долгу изучать, если растягивать - полгода наверное, но база уже будет хорошей, можно даже фронтэндерские задачи решать
Для аудита ИБ, например, на внутренних web-ресурсах компании. Запаковать парсер в контейнер, запустить во внутреннем облаке под kubernetes/openshift, циклично по расписанию (cronjob, например, или в runtime) ходить на внутренние web-ресурсы компании и делать brutforce по словарю. Если brutforce сработал, слать оповещение в профильные подразделения, которые отвечают за ресурс на группы рассылки в почте или сразу в службу безопасности.
Ну или просто для индексации веб-страниц и контроля их жизни.
Был пример из жизни, когда нужно было слать на почту людям содержимое html-отчёта в кастомном текстовом формате, использовал что-то похожее, но это было в другом языке.
обычно я читаю статью, ничего не понимаю, потом читаю комментарии и все становится понятнее, а потом перехожу по ссылкам из комментариев и вообще все становится на свои места... тут что то пошло не так))
Нормальная статейка. Спасибо.
"Jsoup! Просто, быстро и удобно!" (c)
Подозреваю, что методов типа title(), text() и body() там еще целая куча.
На данном этапе мне они пока что не нужны, потом полезу их изучать.
Подскажите, почему этих библиотек нет в IntelliJ ?
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
и как их загрузить?
Чтобы использовать сторонние библиотеки, необходимо внести в файл pom.xml в раздел <dependency> информацию о той библиотеке, которую планируешь использовать. Как пример
Можно скачать с сайта: https://jsoup.org/download файл актуальной версии jsoup-1.14.2.jar (code library). В Idea File > Project Structure > Modules, выбрать вкладку Dependencies, нажать + и добавить скачанный jar, поставить галочку и нажать Apply. Библиотека должна появиться в External Libraries.
Спасибо за труды, но тонкости работы по этим примерам совершенно не раскрыты. Лично для меня, статья показалась куцей и неподходящей для тех, кто ни чего не смыслит в парсинге.
Если честно, статья на самом деле не о чем. Нет ни плюсов , ни минусов библиотеки, в общих чертах только что за библиотека. Пример не разобран, мы должны сами все додумать. Друг, зачем ты пишешь только ради того чтобы написать, потрать время, разбери основы библиотеки этой, дай людям инфу, или хотя бы посоветуй книгу какую по работе с библиотекой. Спасибо!
Статья неплохая, но зачем столько непонятных и новых понятий вводится в самом её начале? Кажется, совершенно можно было обойтись без них, а так они вводят только дополнительную сложность.
Ни хрена не понял, какие возможности у Jsoup, а термины в начале посыпались как град среди ясного неба, вроде статья маленькая но после прочтения ничего почти полезного не усвоил за то каша в голове образовалась дай бог. Если кто знает годные статейки по данной теме кидайте буду рад ознакомится!
Очень интересен вопрос можно ли с помощью jsoup библиотеки реализовать загрузку картинки на какой то репозитори и получения ссылки на данную картинку,буду очень рад каждому ответу кто хоть как то догадывается как реализовать это.Нужен такой сервис который будет по введенному пользователем имени находить файл и загружать на репозитори и в конце получать ссылку на данную картинку
Скажите пожалуйста, разбирая страницу по ссылке данной либой можно сразу зацепить подключенные скрипты? Или нужно захватить страницу и дальше уже разбирая все по тегам подгружать подключенные к ней скрипты?
По-моему, на форуме кто-то писал, что этот способ не подходит, сервер не принимает решение. Да и если откровенно, разбери ее без помощи сторонних библиотек, больше пользы будет. Я помню тоже с ней промурыжился, но в итоге остался доволен задачей и ее реализацией. =)
Спасибо за проделанную работу, но не мешало бы еще бы прокомментировать код, у тех кто не дошел до 29 уровня, но захотел попробовать, могут возникнуть вопросы)
Скажу по секрету, я до 29-го тоже не дошел ;) В статье сохранены комментарии автора.
Если есть вопросы, задавайте, для этого мы тут все и собрались. На что смогу, постараюсь ответить сам.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Чтоб при разработке и сборке проектов, облегчать себе жизнь!
Не признаёт импорт. Чего не хватает? Как исправить?
Если есть вопросы, задавайте, для этого мы тут все и собрались. На что смогу, постараюсь ответить сам.