GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Java I/O Hướng dẫn phân tích nội dung HTML sử dụng thư viện Jsoup

Hướng dẫn phân tích nội dung HTML sử dụng thư viện Jsoup

Đăng vào 02/01/2018 . Được đăng bởi GP Coder . 10742 Lượt xem . Toàn màn hình

Jsoup là Java HTML Parser. Nó là một thư viện mã nguồn mở, được sử dụng để phân tích nội dung HTML. Jsoup cung cấp các API dùng để lấy và thao tác dữ liệu từ URL hoặc từ tập tin HTML. Jsoup sử dụng các phương thức giống với DOM, CSS , JQuery để lấy dữ liệu và thao tác với dữ liệu.

Nội dung

  • 1 Download thư viện jsoup
  • 2 Các API của thư viện JSoup
  • 3 Ví dụ sử dụng các phương thức của thư viện JSoup

Download thư viện jsoup

Tạo project maven và khai báo thư viện Jsoup vào file pom.xml như sau:


<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	<version>1.11.2</version>
</dependency>

Các API của thư viện JSoup

Jsoup bao gồm nhiều class, tuy nhiên có 3 class quan trọng nhất, bao gồm:
  • org.jsoup.Jsoup
  • org.jsoup.nodes.Document
  • org.jsoup.nodes.Element

Lớp org.jsoup.Jsoup

Phương thứcMô tả
static Connection connect(String url)Tạo và trả về đối tượng Connection kết nối tới URL.
static Document parse(File in, String charsetName)Phân tích một file tài liệu HTML với chỉ định charset .
static Document parse(File in, String charsetName, String baseUri)Phân tích file tài liệu HTML với chỉ định charset, và baseUri.
static Document parse(String html)Phân tích mã HTML và trả về đối tượng Document.
static Document parse(String html, String baseUri)Phân tích mã HTML với baseUri thành đối tượng Document.
static Document parse(URL url, int timeoutMillis)Phân tích một URL thành Document.
static String clean(String bodyHtml, Whitelist whitelist)Trả về HTML an toàn từ HTML đầu vào, bằng cách phân tích HTML đầu vào và lọc nó qua một danh sách trắng (Whitelist) của các thẻ và các thuộc tính được phép.

Lớp org.jsoup.nodes.Document

Phương thứcMô tả
Element body()Truy cập vào phần tử body của tài liệu HTML
Charset charset()Trả về charset được sử dụng trong tài liệu này
void charset(Charset charset)Sét charset sử dụng cho tài liệu này.
Document clone()Tạo một phiên bản copy của tài liệu này, bao gồm copy cả các nodecon.
Element createElement(String tagName)Tạo mới một phần tử
Element head()Truy cập vào phần tử head.
String location()Trả về URL của tài liệu này.
String nodeName()Trả về node name của node này.
Element text(String text)Sét đặt nội dung văn bản (text) của body của tài liệu này.
String title()Trả về nội dung tiêu đề của tài liệu.
void title(String title)Sét đặt nội dung tiêu đề cho tài liệu.

Lớp org.jsoup.nodes.Element

Các phương thức trong mô hình DOM

Jsoup có một vài phương thức gần giống với các phương thức trong mô hình DOM (Một mô hình để phân tích tài liệu XML).

Phương thứcMô tả
Element getElementById(String id)Tìm một phần tử cho bởi ID, bao gồm hoặc bên dưới phần tử này.
Elements getElementsByTag(String tag)Tìm các phần tử, bao gồm và cả đệ quy dưới phần tử này, với tên thẻ chỉ định.
Elements getElementsByClass(String className)Tìm phần tử có classNam cho bởi tham số, bao gồm hoặc dưới phần tử này.
Elements getElementsByAttribute(String key)Tìm kiếm các phần tử có thuộc tính cho bởi tham số, không phân biệt chữ hoa chữ thường.
Elements siblingElements()Trả về các phần tử anh em với phần tử hiện tại.
Element firstElementSibling()Trả về phần tử anh em đầu tiên của phần tử hiện tại.
Element lastElementSibling()Trả về phần tử anh em cuối cùng của phần tử hiện tại.
……

Các phương thức lấy dữ liệu trên Element

Phương thứcMô tả
String attr(String key)Trả về giá trị thuộc tính cho bởi key của phần tử này.
void attr(String key, String value)Sét giá trị thuộc tính. Nếu thuộc tính đã tồn tại, nó sẽ bị thay thế.
String id()Trả về thuộc tính ID, nếu có, hoặc trả về string rỗng nếu không có.
String className()Trả về chuỗi chữ giá trị của thuộc tính “class”, nó có thể chứa nhiều class name, ngăn cách bởi khoảng trắng. (Ví dụ <div class=”header gray”> trả về “header gray”)
Set<String> classNames()Trả về tất cả các class names. Ví dụ <div class=”header gray”>, trả về tập hợp 2 phần tử “header” và “gray”. Chú ý, sửa đổi trên tập hợp này không làm thay đổi thuộc tính của phần tử. Muốn thay đổi sử dụng phương thức classNames(java.util.Set).
String text()Trả về một văn bản kết hợp text của nó và tất cả các text của tất cả các phần tử con.
void text(String value)Set text cho phần tử này.
String html()Trả về String các HTML bên trong thẻ này. Ví dụ <div><p>a</p> trả về <p>a</p>. (Node.outerHtml() sẽ trả về <div><p>a</p></div>.)
void html(String value)Xóa hết các HTML sẵn có bên trong và Set Html bên trong phần tử này.
Tag tag()Trả về Tag cho phần tử này.
String tagName()Trả về tên thẻ của phần tử này. Ví dụ div.
……

Các phương thức thay đổi DOM HTML

Phương thứcMô tả
Element append(String html)Nối thêm HTML vào trong phần tử này. Html được cung cấp sẽ được phân tích, và các node sẽ được nối vào phía cuối tập các node con của phần tử này.
Element prepend(String html)Nối thêm HTML vào phần tử này. Html được cung cấp sẽ được phân tích, và các node sẽ được nối vào phía trước tập các node con của phẩn tử này.
Element appendText(String text)Tạo và nối một TextNode mới vào phần tử này.
Element prependText(String text)Tạo và nối một TextNode mới vào phía trước tập các node con của phần tử này.
Element appendElement(String tagName)Tạo một phần tử mới cho bởi tag name. Và nối nó vào như phần tử con ở cuối cùng.
Element prependElement(String tagName)Tạo mới một phần tử bởi tag name, và nối nó vào như phần tử con đầu tiên.
Element html(String value)Sét đặt html bên trong phần tử này. Xóa hết Html bên trong sẵn có.
……

Các phương thức tương tự Css, jQuery

Jsoup cung cấp một vài phương thức để tìm kiếm, truy vấn các phần tử sử dụng ngữ pháp giống CSS hoặc jQuery:

  • Element.select(String selector)
  • Elements.select(String selector)

Ví dụ:


Connection conn = Jsoup.connect("http://o7planning.org");
Document doc = conn.get();

// Phần tử a với thuộc tính href
Elements links = doc.select("a[href]");

// img với thuộc tính src kết thúc bởi .png
Elements pngs = doc.select("img[src$=.png]");

// div với class=masthead
Element masthead = doc.select("div.masthead").first();

// Phần tử a ngay sau h3.
Elements resultLinks = doc.select("h3.r > a");

Danh sách các Selector

SelectorMô tả
tagnameTìm kiếm các phần tử theo tên thẻ. Ví dụ: a
ns|tagTìm kiếm các phần tử theo tên thẻ trong một không gian tên (namespace), ví dụ fb|name nghĩa là tìm các phần tử <fb:name>
#idTìm kiếm phần tử theo ID, ví dụ #logo
.class:Tìm kiếm các phần tử theo tên class, ví dụ .masthead
[attribute]Các phần tử với thuộc tính, ví dụ [href]
[^attr]Các phần tử với thuộc tính bắt đầu bởi, ví dụ [^data-] tìm kiếm các phần tử với thuộc tính bắt đầu bởi data-
[attr=value]Các phần tử với giá trị thuộc tính, ví dụ [width=500] (Cũng có thể sử dụng dấu nháy kép)
[attr^=value], [attr$=value], [attr*=value]Các phần tử với giá trị thuộc tính bắt đầu, kết thúc bởi, hoặc chứa giá trị, ví dụ [href*=/path/]
[attr~=regex]Các phần tử với giá trị khớp với biểu thức chính quy, ví dụ img[src~=(?i)\.(png|jpe?g)]
*Tất cả các phần tử, ví dụ *

Selector kết hợp

SelectorMô tả
el#idPhần tử với ID, ví dụ div#logo
el.classCác phần tử với class, ví dụ div.masthead
el[attr]Các phần tử với thuộc tính, ví dụ a[href]
Kết hợp bất kỳVí dụ a[href].highlight
ancestor child(Phần tử tổ tiên- và hậu duệ) Các phần tử hậu duệ của một phần tử, ví dụ. .body p tìm kiếm các phần tử p bất kỳ là hậu duệ của phần tử có thuộc tính class = “body”.
parent > childCác phần tử con trực tiếp của phần tử cha, ví dụ div.content > p tìm kiếm các phần tử p là con trực tiếp của div có class =’content’; và body > * tìm kiếm các phần tử con trực tiếp của thẻ body.
siblingA + siblingBTìm kiếm phần tử anh em B ngay phía trước của phần tử A, ví dụ div.head + div
siblingA ~ siblingXTìm kiếm các phần tử anh em X trước phần tử A, ví dụ h1 ~ p
el, el, elNhóm nhiều Selector, tìm kiếm các phần tử khớp với một trong những Selector; ví dụ div.masthead, div.logo

Pseudo selectors

SelectorMô tả
:lt(n)Tìm kiếm các phần tử có chỉ số anh em (vị trí trong cây DOM quan hệ với phần tử cha của nó) nhỏ hơn n; ví dụ td:lt(3)
:gt(n)Tìm kiếm các phần tử có chỉ số anh em lớn hơn n, ví dụ div p:gt(2)
:eq(n)find elements whose sibling index is equal to n; e.g. form input:eq(1)
:has(seletor)Tìm kiếm các phần tử chứa các phần tử khớp với selector; ví dụ div:has(p)
:not(selector)Tìm kiếm các phần tử không khớp với selector; ví dụ div:not(.logo)
:contains(text)Tìm kiếm các phần tử chứa đoạn text đã cho. Tìm kiếm không phân biệt chữ hoa chữ thường; ví dụ p:contains(jsoup)
:containsOwn(text)Tìm kiếm các phần tử trực tiếp chứa đoạn text đã cho
:matches(regex)Tìm kiếm các phần tử mà text khớp với biểu thức chính quy chỉ định; ví dụ div:matches((?i)login)
:matchesOwn(regex)Tìm kiếm các phần tử mà text của nó khớp với biểu thức chính quy chỉ định.
Chú ý: Cách đánh chỉ số pseudo bắt đầu từ 0, phần tử đầu tiên có chỉ số 0, phần tử thứ 2 có chỉ số 1,..

Ví dụ sử dụng các phương thức của thư viện JSoup


package com.gpcoder;

import java.io.File;
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 JSoupExample {
	public static void main(String[] args) throws IOException {
		getTitleOfUrl();
		getTitleOfHtmlFile();
		getTitleOfHtmlString();
		getAllPostLinks();
		getAllPostImages();
		getFormParameters();
	}

	// Tạo Document từ URL và lấy title
	public static void getTitleOfUrl() throws IOException {
		Document doc = Jsoup.connect("https://gpcoder.com").get();
		String title = doc.title();
		System.out.println(title);
	}

	// Tạo Document từ file HTML và lấy title
	public static void getTitleOfHtmlFile() throws IOException {
		Document doc = Jsoup.parse("D:/WorkSpace/gpcoder/JSoupTutorial/index.html");
		String title = doc.title();
		System.out.println(title);
	}

	// Tạo Document từ chuỗi HTML và lấy title
	public static void getTitleOfHtmlString() throws IOException {
		String html = "<html><head><title>Java Tutorials</title></head>"
			+ "<body>Welcome to GP Coder</body></html>";
		Document doc = Jsoup.parse(html);
		String title = doc.title(); 
		System.out.println(title);
	}

	// Lấy tất cả liên kết của bài viết
	public static void getAllPostLinks() throws IOException {
		Document doc = Jsoup.connect("https://gpcoder.com").get();
		Elements links = doc.select(".entry-title a[href]");
		for (Element link : links) {
			System.out.println("\nlink : " + link.attr("href"));
			System.out.println("text : " + link.text());
		}
	}

	// Lấy tất cả ảnh đại diện của bài viết
	public static void getAllPostImages() throws IOException {
		Document doc = Jsoup.connect("https://gpcoder.com").get();  
		Elements images = doc.select("article img[src~=(?i)\\.(png|jpe?g|gif)]");
		for (Element image : images) {
			System.out.println("\nsrc : " + image.attr("src"));
			System.out.println("height : " + image.attr("height"));
			System.out.println("width : " + image.attr("width"));
			System.out.println("alt : " + image.attr("alt"));
		} 
	}

	// Lấy tất cả thông tin của HTML form
	public static void getFormParameters() throws IOException {
		Document doc = Jsoup.parse(new File("D:/WorkSpace/gpcoder/JSoupTutorial/register.html"), "UTF-8");
		Element loginform = doc.getElementById("registerform");

		Elements inputElements = loginform.getElementsByTag("input");
		for (Element inputElement : inputElements) {
			String key = inputElement.attr("name");
			String value = inputElement.attr("value");
			System.out.println("Param name: " + key + " \nParam value: " + value);
		}
	}
}

Tài liệu tham khảo:

  • https://jsoup.org/
  • http://o7planning.org/vi/10399/huong-dan-su-dung-java-jsoup-phan-tich-html
  • https://www.javatpoint.com/jsoup-tutorial
5.0
12
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Java I/O Được gắn thẻ: html parser, jsoup

Hướng dẫn chuyển đổi Java Object sang XML và XML sang Java Object sử dụng Java JAXB
Giới thiệu Json

Có thể bạn muốn xem:

  • Hướng dẫn sử dụng Lớp FilePermission trong java (16/12/2017)
  • Hướng dẫn đọc và ghi file excel trong Java sử dụng thư viện Apache POI (23/12/2017)
  • Thao tác với tập tin và thư mục trong Java (14/12/2017)
  • Hướng dẫn chuyển đổi Java Object sang XML và XML sang Java Object sử dụng Java JAXB (30/12/2017)
  • Hướng dẫn sử dụng Printing Service trong Java (17/12/2017)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98058 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97699 lượt xem)
  • Giới thiệu Design Patterns (87764 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86433 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83839 lượt xem)

Nội dung bài viết

  • 1 Download thư viện jsoup
  • 2 Các API của thư viện JSoup
  • 3 Ví dụ sử dụng các phương thức của thư viện JSoup

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link