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
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
- org.jsoup.Jsoup
- org.jsoup.nodes.Document
- org.jsoup.nodes.Element
Lớp org.jsoup.Jsoup
Phương thức | Mô 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ức | Mô 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ức | Mô 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ức | Mô 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ức | Mô 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
Selector | Mô tả |
tagname | Tìm kiếm các phần tử theo tên thẻ. Ví dụ: a |
ns|tag | Tì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> |
#id | Tì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
Selector | Mô tả |
el#id | Phần tử với ID, ví dụ div#logo |
el.class | Cá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 > child | Cá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 + siblingB | Tì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 ~ siblingX | Tìm kiếm các phần tử anh em X trước phần tử A, ví dụ h1 ~ p |
el, el, el | Nhó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
Selector | Mô 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: