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.
Розбір 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>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>
За допомогою 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-документ з локальної файлової системи.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
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 тільки відповідні елементи)