JavaRush /Blog Java /Random-VI /Phân tích cú pháp HTML dễ dàng với jsoup
Stanislav
Mức độ
Москва

Phân tích cú pháp HTML dễ dàng với jsoup

Xuất bản trong nhóm
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ớp Documenttừ 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 Agentlà 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. Referrerchứ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/catchmộ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 divmột khối có lớp được chỉ định mà chúng ta sẽ sử dụng để lấy mẫu. Phân tích cú pháp HTML dễ dàng bằng jsoup - 1Hãy sử dụng lớp Elementstừ 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: Phân tích cú pháp HTML dễ dàng bằng jsoup - 2Bâ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: Phân tích cú pháp HTML dễ dàng bằng jsoup - 3Dễ 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());

Phần kết luận

Ví dụ này chỉ cho thấy một phần nhỏ khả năng của jsoup. Ngoài ra còn có một thực tế là các trang web thường xuyên được cập nhật, thay đổi cấu trúc của mã đánh dấu, vì vậy khi làm việc với Scraping, bạn cần sẵn sàng thích ứng với những thay đổi. Bạn có thể lấy thêm thông tin và phiên bản hiện tại trên trang web chính thức jsoup.org ; bạn có thể đọc thêm về các lớp và phương thức tại o7planning.org . Tôi sẽ để lại liên kết tới github của tôi , tại thời điểm viết bài, có một số bot Telegram sử dụng Jsoup để nhận và hiển thị thông tin.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION