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 бібліотека, яка здійснює потрібну мені функціональність, але я не знав, що вона буде такою чудовою і багатофункціональною як Soup. Вона не тільки забезпечує підтримку читання та розбирання HTML файлів, атрибутів, CSS класів у стилі JQuery, але й водночас дозволяє модифікувати їх. Використовуючи Soup Ви можете зробити з HTML документом все, що завгодно. У цій статті ми розбиратимемо HTML файл і знаходимо назви та атрибути тегів. Також ми розберемо приклади завантаження та розбирання HTML з файлу та будь-якої URL-адресаи, наприклад домашню сторінку Google. Коли я зіткнувся з цим, я був впевнений, що рішенням буде open-source бібліотека, яка здійснює потрібну мені функціональність, але я не знав, що вона буде такою чудовою і багатофункціональною як Soup. Вона не тільки забезпечує підтримку читання та розбирання HTML файлів, атрибутів, CSS класів у стилі JQuery, але й водночас дозволяє модифікувати їх. Використовуючи Soup Ви можете зробити з HTML документом все, що завгодно. У цій статті ми розбиратимемо HTML файл і знаходимо назви та атрибути тегів. Також ми розберемо приклади завантаження та розбирання HTML з файлу та будь-якої URL-адресаи, наприклад домашню сторінку Google. Коли я зіткнувся з цим, я був впевнений, що рішенням буде open-source бібліотека, яка здійснює потрібну мені функціональність, але я не знав, що вона буде такою чудовою і багатофункціональною як Soup. Вона не тільки забезпечує підтримку читання та розбирання HTML файлів, атрибутів, CSS класів у стилі JQuery, але й водночас дозволяє модифікувати їх. Використовуючи Soup Ви можете зробити з HTML документом все, що завгодно. У цій статті ми розбиратимемо HTML файл і знаходимо назви та атрибути тегів. Також ми розберемо приклади завантаження та розбирання HTML з файлу та будь-якої URL-адресаи, наприклад домашню сторінку Google. Вона не тільки забезпечує підтримку читання та розбирання HTML файлів, атрибутів, CSS класів у стилі JQuery, але й водночас дозволяє модифікувати їх. Використовуючи Soup Ви можете зробити з HTML документом все, що завгодно. У цій статті ми розбиратимемо HTML файл і знаходимо назви та атрибути тегів. Також ми розберемо приклади завантаження та розбирання HTML з файлу та будь-якої URL-адресаи, наприклад домашню сторінку Google. Вона не тільки забезпечує підтримку читання та розбирання HTML файлів, атрибутів, CSS класів у стилі JQuery, але й водночас дозволяє модифікувати їх. Використовуючи Soup Ви можете зробити з HTML документом все, що завгодно. У цій статті ми розбиратимемо HTML файл і знаходимо назви та атрибути тегів. Також ми розберемо приклади завантаження та розбирання HTML з файлу та будь-якої URL-адресаи, наприклад домашню сторінку Google.
Що таке Súp
Soup це open-source бібліотека Java для роботи з реальним HTML. Вона забезпечує дуже зручний API для вилучення та маніпулювання даними, використовуючи найкращі DOM, CSS, та JQuery-подібні методи. Soup реалізує WHATWG HTML5 специфікацію, і розбирає HTML у ту саму модель DOM, як це роблять сучасні браузер на кшталт Chrome та Firefox. Ось деякі з корисних функцій Súp бібліотеки:
Soup може очистити та розібрати HTML з URL, файлу чи рядка.
Soup може знайти та витягти дані, використовуючи обхід DOM або CSS селектори.
Soup дозволяє маніпулювати HTML елементами, атрибутами та текстом.
Soup забезпечує очищення наданої користувачем інформації white-list, для запобігання XSS атак.
Також Soup видає "акуратний" HTML.
Soup призначений для роботи з різними видами HTML, що існують у реальному світі, включаючи належним чином підтверджений HTML з неповним непідтвердженим набором тегів. Одна з основних переваг Soup – це його надійність.
Розбір HTML у Java використовуючи Soup
У цьому підручнику ми побачимо три різні приклади розбору та обходу HTML-документа Java використовуючи Soup. У першому прикладі, ми розбиратимемо 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>LoginPage</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>
За допомогою Súp дуже просто розібрати HTML, все, що Вам потрібно це викликати статичний метод Jsoup.parse()і передати в нього Ваш HTML рядок. Soup надає кілька перевантажених методів parse()для читання HTML з рядка, файлу, базового URI, URL і з InputStream. Ви також можете вказати кодування для коректного читання HTML файлу, якщо він не у форматі "UTF-8". Метод parse(String html)розбирає вхідний HTML у новий об'єкт Document. У Súp клас 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-документ з локальної файлової системи.
importjava.io.File;importjava.io.IOException;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.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
*/publicclassHTMLParser{publicstaticvoidmain(String args[]){// Parse HTML String using JSoup libraryStringHTMLSTring="<!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 URLDocument 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"); // wrongDocument htmlFile =null;try{
htmlFile =Jsoup.parse(newFile("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 elementSystem.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 StringtoJSoup:<!DOCTYPE html><html><head><title>JSoupExample</title></head><body><table><tr><td><h1>HelloWorld</h1></tr></table></body></html>After parsing,Title:JSoupExampleAfte parsing,Heading:HelloWorldJsoupCan read HTML page from URL, title :GoogleJsoup can also parse HTML file directly
title :LoginPageclass of div tag : simple
Soup HTML парсер докладатиме всіх зусиль, для створення "чистого" розбору, наданого Вами HTML, незалежно від того, правильно він сформований чи ні. Він може обробляти такі помилки:
незакриті теги. Наприклад,<p>Java <p>Scala to <p>Java</p> <p>Scala</p>
мається на увазі теги. Наприклад, відкриті <td>Java is Great</td>будуть обернуті в<table><tr><td>
Soup створює надійні структури документа (HTML містить head і body, при цьому body тільки відповідні елементи)
Soup є відмінною та надійною open-source бібліотекою, яка робить читання html документа, фрагментів body, html рядків та безпосередній розбір html вмісту веб, дуже простим.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ