Рубрики
Без рубрики

jsoup Java HTML-анализатор

пример jsoup, учебник по jsoup, очистка веб-страниц с помощью jsoup, синтаксический анализатор java html, зависимость jsoup maven, jsoup для загрузки jar, пример api jsoup

Автор оригинала: Pankaj Kumar.

jsoup-это синтаксический анализатор Java HTML с открытым исходным кодом, который мы можем использовать для анализа HTML и извлечения полезной информации. Вы также можете рассматривать soup как инструмент для очистки веб – страниц на языке программирования java.

jsoup

API jsoup можно использовать для извлечения HTML-кода из URL-адреса или его анализа из HTML-строки или из HTML-файла.

Некоторые из интересных функций API jsoup являются;

  1. удалите HTML-код из URL-адреса или прочитайте его из строки или из файла.
  2. Извлекайте данные из html с помощью обхода на основе DOM или с помощью CSS, таких как селекторы.
  3. API jsoup также можно использовать для редактирования HTML.
  4. API jsoup самодостаточен, нам не нужны никакие другие банки для его использования.

Вы можете скачать jsoup jar с его веб-сайта или, если вы используете maven, добавьте для него зависимость ниже.


	org.jsoup
	jsoup
	1.8.1

Давайте рассмотрим различные функции jsoup одну за другой.

пример jsoup для загрузки HTML-документа с URL-адреса

Мы можем сделать это с помощью однострочного кода, как показано ниже.

org.jsoup.nodes.Document doc = org.jsoup.Jsoup.connect("https://www.journaldev.com").get();
System.out.println(doc.html()); // prints HTML data

пример jsoup для анализа HTML-документа из строки

Если у нас есть HTML-данные в виде строки, мы можем использовать приведенный ниже код для их анализа.

String source = "Jsoup Example"
		+ "

Welcome to JournalDev!!


" + ""; Document doc = Jsoup.parse(source);

пример jsoup для загрузки документа из файла

Если данные HTML сохранены в файле, мы можем загрузить их, используя приведенный ниже код.

Document doc = Jsoup.parse(new File("data.html"), "UTF-8");

Разбор фрагмента HTML-текста

Одна из лучших особенностей jsoup заключается в том, что если мы предоставляем фрагментированные данные html-кода, он изо всех сил пытается создать для нас допустимый HTML-код, как показано в приведенном ниже примере.

String html = "

Test Data

"; Document doc1 = Jsoup.parseBodyFragment(html); System.out.println(doc1.html());

Приведенный выше код выводит следующий HTML-код.


 
 
  

Test Data

Давайте теперь рассмотрим различные методы извлечения данных из HTML.

Методы Jsoup DOM

Так же, как и HTML, Jsoup анализирует HTML в документе. Документ состоит из различных элементов, и существует множество полезных методов, которые мы можем использовать для поиска элементов. Некоторые из этих методов в документе являются;

  1. getElementById(строковый идентификатор)
  2. getElementsByTag(Строковый тег)
  3. getElementsByClass(Строковое имя класса)
  4. Атрибут getElementsByAttribute(строковый ключ)
  5. элементы-братья(), первый элемент-брат(), последний элемент-брат() и т.д.

Элемент имеет разные атрибуты, поэтому у нас также есть некоторые методы для данных элемента.

  1. attr(строковый ключ) для получения и attr(строковый ключ, строковое значение) для установки атрибутов
  2. идентификатор(), имя класса() и имена классов()
  3. текст() для получения и текст(строковое значение) для задания текстового содержимого
  4. html() для получения и html(строковое значение) для установки содержимого innerHTML
  5. тег() и имя тега()

Существует также несколько методов для манипулирования данными HTML.

  1. добавить(Строка html), добавить(строка html)
  2. Текст приложения(Текст строки), Текст добавления(текст строки)
  3. Элемент добавления(Имя строки), Элемент добавления(Имя строки)
  4. html(Строковое значение)

Ниже приведен простой пример, в котором я использую методы jsoup DOM для анализа домашней страницы моего сайта и перечисления всех ссылок.

package com.journaldev.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExtractLinks {

	public static void main(String[] args) throws IOException {

		Document doc = Jsoup.connect("https://www.journaldev.com").get();
		Element content = doc.getElementById("content");
		Elements links = content.getElementsByTag("a");
		for (Element link : links) {
		  String linkHref = link.attr("href");
		  String linkText = link.text();
		  System.out.println("Text::"+linkText+", URL::"+linkHref);
		}
	}

}

Вышеуказанная программа выдает следующий результат.

Text::jQuery Popup and Tooltip Window Animation Effects, URL::https://www.journaldev.com/6998/jquery-popup-and-tooltip-window-animation-effects
Text::Jobin Bennett, URL::https://www.journaldev.com/author/jobin
Text::March 7, 2015, URL::https://www.journaldev.com/6998/jquery-popup-and-tooltip-window-animation-effects
Text::jQuery, URL::https://www.journaldev.com/dev/jquery
Text::jQuery Plugins, URL::https://www.journaldev.com/dev/jquery/jquery-plugins
Text::Permalink, URL::https://www.journaldev.com/6998/jquery-popup-and-tooltip-window-animation-effects
Text::Apache HttpClient Example to send GET/POST HTTP Requests, URL::https://www.journaldev.com/7146/apache-httpclient-example-to-send-get-post-http-requests
Text::Pankaj, URL::https://www.journaldev.com/author/pankaj
Text::March 6, 2015, URL::https://www.journaldev.com/7146/apache-httpclient-example-to-send-get-post-http-requests
Text::Java, URL::https://www.journaldev.com/dev/java
Text::Permalink, URL::https://www.journaldev.com/7146/apache-httpclient-example-to-send-get-post-http-requests
Text::Java HttpURLConnection Example to send HTTP GET/POST Requests, URL::https://www.journaldev.com/7148/java-httpurlconnection-example-to-send-http-getpost-requests
Text::Pankaj, URL::https://www.journaldev.com/author/pankaj
Text::March 6, 2015, URL::https://www.journaldev.com/7148/java-httpurlconnection-example-to-send-http-getpost-requests
Text::Java, URL::https://www.journaldev.com/dev/java
Text::Permalink, URL::https://www.journaldev.com/7148/java-httpurlconnection-example-to-send-http-getpost-requests
Text::How to integrate Google reCAPTCHA in Java Web Application, URL::https://www.journaldev.com/7133/how-to-integrate-google-recaptcha-in-java-web-application
Text::Pankaj, URL::https://www.journaldev.com/author/pankaj
Text::March 4, 2015, URL::https://www.journaldev.com/7133/how-to-integrate-google-recaptcha-in-java-web-application
Text::Java EE, URL::https://www.journaldev.com/dev/java/j2ee
Text::Permalink, URL::https://www.journaldev.com/7133/how-to-integrate-google-recaptcha-in-java-web-application
Text::JSF Spring Hibernate Integration Example Tutorial, URL::https://www.journaldev.com/7122/jsf-spring-hibernate-integration-example-tutorial
Text::Pankaj, URL::https://www.journaldev.com/author/pankaj
Text::March 3, 2015, URL::https://www.journaldev.com/7122/jsf-spring-hibernate-integration-example-tutorial
Text::Hibernate, URL::https://www.journaldev.com/dev/hibernate
Text::JSF, URL::https://www.journaldev.com/dev/jsf
Text::Spring, URL::https://www.journaldev.com/dev/spring
Text::Permalink, URL::https://www.journaldev.com/7122/jsf-spring-hibernate-integration-example-tutorial
Text::JSF Spring Integration Example Tutorial, URL::https://www.journaldev.com/7112/spring-jsf-integration
Text::Oracle Webcenter Portal Framework Application – Modifying Home Page And Login/Logout Target Pages & Deploying Your Application Into Custom Portal Managed Server Instance, URL::https://www.journaldev.com/6938/oracle-webcenter-portal-framework-application-modifying-home-page-and-loginlogout-target-pages-deploying-your-application-into-custom-portal-managed-server-instance
Text::JSF and JDBC Integration Example Tutorial, URL::https://www.journaldev.com/7068/jsf-database-example-mysql-jdbc
Text::Count the Number of Triangles in Given Picture – Programmatic Solution, URL::https://www.journaldev.com/7064/count-the-number-of-triangles-in-given-picture-programmatic-solution
Text::JSF Expression Language (EL) Example Tutorial, URL::https://www.journaldev.com/7058/jsf-expression-language-jsf-el
Text::Read all Articles →, URL::https://www.journaldev.com/page/2

Синтаксис селектора Jsoup

Мы также можем использовать синтаксис CSS или jQuery, подобный синтаксису, для поиска HTMl-элементов и управления ими. Документ и Элемент содержит select(строковый css-запрос) , который мы можем использовать для этого.

Вот несколько кратких примеров;

  1. doc.select(“a”): возвращает все элементы тега “a” из HTML.
  2. doc.выберите(c|if): находит элементы
  3. doc.выберите(“#id1”): возвращает все теги с
  4. doc.select(“.cl1”): возвращает все теги с
  5. doc.выберите(“[href]”): возвращает все теги с атрибутом href

Мы также можем комбинировать селекторы, более подробную информацию вы можете найти в API селекторов .

Давайте теперь рассмотрим пример, в котором я получу URL-адрес автора Google+ со своего веб-сайта, используя как DOM, так и Selector API.

package com.journaldev.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupFindAuthor {

	public static void main(String[] args) throws IOException {
		//journaldev.com posts have author set as below
		//
findAuthorUsingDOM(); findAuthorUsingSelector(); } private static void findAuthorUsingSelector() throws IOException { Document doc = Jsoup.connect("https://www.journaldev.com").get(); Elements authors = doc.select("div.g-person"); //selector combination for(Element author : authors){ System.out.println("Selector:: Author Google+ URL::"+author.attr("data-href")); } } private static void findAuthorUsingDOM() throws IOException { Document doc = Jsoup.connect("https://www.journaldev.com").get(); Elements authors = doc.getElementsByClass("g-person"); for(Element author : authors){ System.out.println("DOM:: Author Google+ URL::"+author.attr("data-href")); } } }

Приведенная выше программа выводит следующий вывод.

DOM:: Author Google+ URL:://plus.google.com/u/0/118104420597648001532
Selector:: Author Google+ URL:://plus.google.com/u/0/118104420597648001532

пример jsoup для изменения HTML

Давайте теперь рассмотрим пример jsoup, где я буду анализировать входной HTML-код и манипулировать им.

package com.journaldev.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupModifyHTML {

	public static final String SOURCE_HTML = "Jsoup Example"
			+ "

Welcome to JournalDev!!


" + "
Hello
" + "
Pankaj
" + "Home" + "Wikipedia" + ""; public static void main(String[] args) { Document doc = Jsoup.parse(SOURCE_HTML); System.out.println("Title="+doc.title()); //let's add attribute target="_blank" to all the links doc.select("a[href]").attr("rel", "nofollow"); //System.out.println(doc.html()); //change div class="class1" to class2 doc.select("div.class1").attr("class", "class2"); //System.out.println(doc.html()); //change the HTML value of first h1 element doc.select("h1").first().html("Welcome to JournalDev.com"); doc.select("h1").first().append("!!"); //System.out.println(doc.html()); //let's make Home link bold doc.select("a[href]").first().html("Home"); System.out.println(doc.html()); } }

Пожалуйста, внимательно ознакомьтесь с приведенной выше программой, чтобы понять, какие изменения вносятся во входную html-строку. Также сравните его с итоговым документом, как показано ниже в выходных данных.

Title=Jsoup Example

 
  Jsoup Example
 
 
  

Welcome to JournalDev.com!!


Hello
Pankaj
Home Wikipedia

пример jsoup для анализа страницы поиска Google и получения результатов

Прежде чем я завершу этот пост, приведу пример, в котором я анализирую первую страницу результатов поиска Google и извлекаю все ссылки.

package com.journaldev.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ParsingGoogleSearch {

	public static void main(String[] args) throws IOException {
		Document doc = Jsoup.connect("https://www.google.com/search?q=java").userAgent("Mozilla/5.0").get();
		//System.out.println(doc.html());
		Elements resultsH3 = doc.select("h3.r > a");

		for (Element result : resultsH3) {
			String linkHref = result.attr("href");
			String linkText = result.text();
			System.out.println("Text::" + linkText + ", URL::" + linkHref.substring(6, linkHref.indexOf("&")));
		}
	}

}

Он выводит следующий вывод.

Text::Download Free Java Software, URL::=https://java.com/download
Text::java.com: Java + You, URL::=https://www.java.com/
Text::Oracle Technology Network for Java Developers | Oracle ..., URL::=https://www.oracle.com/technetwork/java/
Text::Java (software platform) - Wikipedia, the free encyclopedia, URL::=https://en.wikipedia.org/wiki/Java_(software_platform)
Text::Java (programming language) - Wikipedia, the free encyclopedia, URL::=https://en.wikipedia.org/wiki/Java_(programming_language)
Text::Java Tutorial - TutorialsPoint, URL::=https://www.tutorialspoint.com/java/
Text::Welcome to JavaWorld.com, URL::=https://www.javaworld.com/
Text::Java.net: Welcome, URL::=https://www.java.net/
Text::News for java, URL::h?q=java
Text::Javalobby | The heart of the Java developer community, URL::=https://java.dzone.com/

Обратите внимание, что в настоящее время результаты поиска Google являются частью тега h3 с классом “r”, и, очевидно, для ссылки используется “a”. Поэтому, если в будущем произойдет какое-либо изменение, например, будет изменено имя класса тега h3, то оно не будет работать должным образом, и нам придется внести небольшие изменения, посмотрев на исходную структуру html.

Это все для примера учебника jsoup, я надеюсь, что он поможет вам легко анализировать HTML – данные, когда это необходимо.

Ссылка: Официальный сайт