JavaRush /Java блог /Архив info.javarush /3 примера как разобрать HTML-файл в Java используя Jsoup
Sdu
17 уровень

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

Статья из группы Архив info.javarush
3 примера как разобрать HTML-файл в Java используя Jsoup - 1HTML это ядро 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 файл:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Login Page</title>
    </head>
    <body>
        <div id="login" class="simple" >
            <form action="login.do">
                Username : <input id="username" type="text" /><br>
                Password : <input id="password" type="password" /><br>
                <input id="submit" type="submit" />
                <input id="reset" type="reset" />
            </form>
        </div>
    </body>
</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 содержимого веб, очень простым.
Комментарии (46)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vlad V Уровень 35
27 октября 2023
Охренеть, статья аж 21.12.2014, а до сих пор полезная )
Павел Перминов Уровень 51
11 июля 2023
java.io.FileNotFoundException: login.html (Не удается найти указанный файл) у меня такая ошибка в результате. Подскажите пожалуйста почему?
Kurama Уровень 50
28 ноября 2022
"Jsoup предназначен для работы с различными видами HTML существующими в реальном мире, включая должным образом подтвержденный HTML c неполным неподтвержденным набором тэгов." И как я должен это понять
Viktor Malik Уровень 37
6 июня 2022
Ну вот, нужно изучить основы HTML и CSS, знать, что такое теги, классы, ид, селекторы) одна технология тянет за собой другую, а там уже и JS надо понимать, DOM, и вообще как сайты сделаны)
Андрей Уровень 28
17 декабря 2021
чтобы зависимости подтянулись, перезапустите приложение
Уровень 51
28 ноября 2021
понятно что ничего не понятно , но что я понял это создайте мавен проект и в зависимости добавьте эту шляпу , откройте pom.xml и вставьте это

    <dependencies>
    <dependency>
        <!-- jsoup HTML parser library @ https://jsoup.org/ -->
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.14.3</version>
    </dependency></dependencies>
Maks Panteleev Уровень 41
1 июня 2021
Cпасибо автору, что рассказал подробно как скачать и установить библиотеку. Дизлайк ставлю) 0 информативности вообще)
Denis Уровень 40
21 апреля 2021
зачем это надо?) как применяется?
Илья Уровень 30
11 апреля 2021
В последнем примере вылетает nullpointer
Ilya Уровень 22
25 марта 2021
обычно я читаю статью, ничего не понимаю, потом читаю комментарии и все становится понятнее, а потом перехожу по ссылкам из комментариев и вообще все становится на свои места... тут что то пошло не так))