Sdu
17 уровень

3 примера как разобрать HTML-файл в Java используя Jsoup.

Пост из группы Архив info.javarush.ru
3786 участников

3 Examples of Parsing HTML File in Java using Jsoup

by Javin Paul on September 23rd, 2014
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 файл: Login Page Username : Password : С помощью 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 = "" + "" + "" + "JSoup Example" + "" + "" + "" + "HelloWorld" + "" + ""; 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 :JSoup ExampleHelloWorld 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, независимо от того, правильно он сформирован или нет. Он может обрабатывать следующие ошибки:
  • незакрытые тэги. Например, Java Scala to Java Scala
  • подразумеваемые тэги. Например, открытые Java is Great будут обернуты в Jsoup создает надежные структуры документа (HTML содержит head и body, при этом в body только соответствующие элементы) Jsoup является отличной и надежной open-source библиотекой, которая делает чтение html документа, фрагментов body, html строк и непосредственный разбор html содержимого веб, очень простым. http://www.javacodegeeks.com/2014/09/3-examples-of-parsing-html-file-in-java-using-jsoup.html
Комментарии (14)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Anton36 уровень, Москва
14 июня, 04:48
Похоже основная работа по осознанию данной библиотеки будет как раз в среде разработки. Слишком общие понятия тут. Я как то баловался с DOM SAX JAXB.
Dimka0431 уровень
2 марта, 14:16
Это очень круто, а главное, всё понятно с первого раза, спасибо большое!
DeathGun44216 уровень
13 сентября 2017, 20:09
на самом деле использовались библиотека Swing
RBlik30 уровень
23 июня 2016, 19:59
крууто!!! и очень просто. спасибо
generatorideas30 уровень, Москва
19 июня 2016, 14:01
Можно подключить jsoup через Maven, потренироваться так сказать!
Чтоб при разработке и сборке проектов, облегчать себе жизнь!
<dependencies>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.1</version>
        </dependency>
</dependencies>
Hehabr13 уровень, Peine
2 мая 2016, 14:01
Почему то у меня Eclipse вот эти 3 строки красным подчёркивает.
Не признаёт импорт. Чего не хватает? Как исправить?

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
Sphincs39 уровень, Минск
13 мая 2016, 10:03
С сайта jsoup — Java HTML Parser скачай либу и sources, подключи к IDE. видимо, не дошел до большой задачи 28 уровня, там это есть в условии
AlexandrRS41 уровень, Санкт-Петербург
7 июня 2015, 19:21
Этот способ можно использовать для решения задачи level19.lesson10.bonus03?
Javis30 уровень
8 июня 2015, 02:24
По-моему, на форуме кто-то писал, что этот способ не подходит, сервер не принимает решение. Да и если откровенно, разбери ее без помощи сторонних библиотек, больше пользы будет. Я помню тоже с ней промурыжился, но в итоге остался доволен задачей и ее реализацией. =)
AlexandrRS41 уровень, Санкт-Петербург
8 июня 2015, 10:38
Так и собирался. )) Позарился на легкий путь.
B0gdan38 уровень, Baku
24 марта 2015, 16:36
Отличная библиотека и примеры. Спасибо!
artushenko20 уровень
30 декабря 2014, 15:43
Для парсинга html-страниц очень хорошая библиотека, сам с недавнего времени начал ее использовать и очень доволен, все просто до невозможности.
Captain33 уровень
23 декабря 2014, 22:02
Спасибо за проделанную работу, но не мешало бы еще бы прокомментировать код, у тех кто не дошел до 29 уровня, но захотел попробовать, могут возникнуть вопросы)
Sdu17 уровень
23 декабря 2014, 23:35
Скажу по секрету, я до 29-го тоже не дошел ;) В статье сохранены комментарии автора.
Если есть вопросы, задавайте, для этого мы тут все и собрались. На что смогу, постараюсь ответить сам.