Có lẽ một ngày nào đó bạn sẽ cần lấy thông tin từ một trang web hoặc tài liệu HTML trong ứng dụng của mình và tôi sẽ nói ngay rằng việc sử dụng thư viện jsoup sẽ đơn giản hóa rất nhiều công việc của bạn. Theo wiki , jsoup là một thư viện Java mã nguồn mở được thiết kế để phân tích, trích xuất và thao tác dữ liệu được lưu trữ trong các tài liệu HTML.
Bắt đầu nhanh
Thư viện có thể được tải xuống dưới dạng tệp jar và đặt trong một dự án hoặc được kết nối bằng Maven/Gradle. Tôi sẽ để lại liên kết đến trang web chính thức ở cuối bài viết: ở đó bạn có thể tìm thấy phiên bản hiện tại của thư viện. Trong ví dụ chúng ta sẽ sử dụng kết nối qua Maven. Hãy thêm một phụ thuộc:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Cách sử dụng
Trước hết, bạn cần lấy một phiên bản của lớpDocument
từ org.jsoup.nodes.Document cho biết nguồn để phân tích cú pháp. Nó có thể là một tập tin cục bộ hoặc một liên kết. Ví dụ: trong bài viết này, chúng tôi sẽ sử dụng trang web yandex.ru và cố gắng lấy nguồn cấp tin tức hiện tại của họ:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
là một mã định danh được truyền đạt đến trang web đang được truy cập. Trên nhiều trang web, đây là tiêu chí quan trọng nhất đối với bộ lọc chống thư rác. Referrer
chứa URL của nguồn yêu cầu. Phương thức này get()
ném ra một IOException đã được xử lý, vì vậy chúng ta có thể gói mọi thứ vào try/catch
một khối hoặc chỉ cần ném nó đi xa hơn bằng throws
. Bây giờ chúng tôi đã nhận được mã nguồn của trang này. Nếu cần, thư viện jsoup có thể khôi phục các phần tử bị hỏng. Bây giờ tất cả những gì chúng ta phải làm là thu hẹp tìm kiếm vào một khối riêng biệt. Phương thức này select()
có nhiều lựa chọn sử dụng: nó cho phép bạn tìm kiếm các phần tử theo thẻ, thuộc tính, lớp và các tham số khác. Hầu như tất cả các trình duyệt hiện đại đều hỗ trợ khả năng tìm kiếm nhanh chóng mã nguồn của phần tử đã chọn. Với các thao tác đơn giản, chúng ta tìm thấy mã nguồn của phần tử mình cần và lấy div
một khối có lớp được chỉ định mà chúng ta sẽ sử dụng để lấy mẫu. Hãy sử dụng lớp Elements
từ org.jsoup.select.Elements để chọn tất cả các thành phần từ khối đã chọn của chúng ta.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Bây giờ chúng ta có một cái gì đó như thế này: Bây giờ tất cả những gì chúng ta phải làm là sử dụng một vòng lặp nhỏ để lặp qua tất cả các phần tử:
for (Element element : listNews.select("a"))
System.out.println(element.text());
Phương pháp này text()
cho phép bạn loại bỏ mã đánh dấu và chỉ để lại tổ hợp văn bản cho tất cả các phần tử đến. Kết quả thực hiện sẽ như sau: Dễ dàng nhận thấy số hàng thực tế nhận được không tương ứng với số hàng hiển thị thực tế trên trang. Đây là nơi có những cạm bẫy. Nếu bạn nhìn vào mã nguồn của đánh dấu, bạn sẽ nhận thấy rằng những tin tức mới nhất thay đổi một cách linh hoạt trong một khoảng thời gian nhất định. Một số “viên đá” này được giải quyết bằng cách lấy mẫu bổ sung và tất nhiên là các bài kiểm tra. Có thể năm phần tử đầu tiên sẽ chứa thông tin chúng ta cần và phần tử thứ sáu sẽ chỉ chứa một dòng trống theo kịch bản. Điều cũng xảy ra là các khối sẽ không có bất kỳ mã định danh nào, khi đó có thể trỏ trực tiếp bằng một phương thức get(int index)
tới số vị trí của phần tử được đề cập.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION