JavaRush /Java Blog /Random-TW /使用 jsoup 輕鬆解析 HTML
Stanislav
等級 21
Москва

使用 jsoup 輕鬆解析 HTML

在 Random-TW 群組發布
也許有一天您需要從應用程式中的網站或 HTML 文件中獲取信息,我會毫不誇張地說,使用 jsoup 庫將大大簡化您的任務。 根據wiki,jsoup 是一個開源 Java 函式庫,旨在解析、提取和操作 HTML 文件中儲存的資料。

快速啟動

該庫可以作為 jar 檔案下載並放置在專案中,或使用 Maven/Gradle 連接。我會在文章末尾留下一個官方網站的連結:在那裡你可以找到該庫的當前版本。在範例中,我們將透過 Maven 使用連接。讓我們新增一個依賴項:
<​dependency​>
  <​groupId>org.jsoup</groupId>
  <​artifactId>jsoup</artifactId>
  <​version>1.11.3</version>
</dependency>

用法

首先,您需要Document從 org.jsoup.nodes.Document 取得該類別的實例,指示解析的來源。它可以是本地文件或連結。例如,在本文中,我們將使用網站 yandex.ru 並嘗試獲取他們當前的動態消息:
Document doc = Jsoup.connect("https://yandex.ru/")
                .userAgent("Chrome/4.0.249.0 Safari/532.5")
                .referrer("http://www.google.com")
                .get();
User Agent是傳送到正在存取的網站的識別碼。在許多網站上,它是反垃圾郵件過濾器最重要的標準。 Referrer包含請求來源的 URL。這個方法get()拋出一個已處理的 IOException,因此我們可以將所有內容包裝在try/catch一個區塊中,或者只是使用 進一步拋出它throws。我們現在已經收到了該頁面的源代碼。如果需要,jsoup 庫本身可以恢復損壞的元素。現在我們要做的就是將搜尋範圍縮小到一個單獨的區塊。此方法select()有多種用途:它允許您透過標籤、屬性、類別和其他參數來搜尋元素。幾乎所有現代瀏覽器都支援快速搜尋所選元素的原始程式碼的功能。透過簡單的操作,我們找到所需元素的原始程式碼,並獲得div具有指定類別的區塊,我們將使用它進行採樣。 使用 jsoup 輕鬆解析 HTML - 1讓我們使用 org.jsoup.select.Elements 中的類別Elements來選擇所選區塊中的所有元素。
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
現在我們有這樣的東西: 使用 jsoup 輕鬆解析 HTML - 2現在我們要做的就是使用一個小循環來迭代所有元素:
for (Element element : listNews.select("a"))
            System.out.println(element.text());
此方法text()允許您丟棄標記代碼,只為所有傳入元素留下文字組合。執行結果如下: 使用 jsoup 輕鬆解析 HTML - 3很容易注意到,實際接收的行數與頁面上實際顯示的行數並不對應。這就是陷阱所在。如果您查看標記的源代碼,您會注意到最新新聞以特定時間間隔動態變化。其中一些“石頭”可以通過額外的採樣,當然還有測試來解決。可能結果是前五個元素將包含我們需要的訊息,而第六個元素將只包含腳本化的空白行。區塊也可能沒有任何標識符,那麼可以使用方法直接指向get(int index)相關元素的位置號。
System.out.println(listNews.select("a").get(2).text());

結論

此範例僅展示了 jsoup 功能的一小部分。還有一個事實是,網站經常更新,改變標記程式碼的結構,因此在使用抓取時,您需要準備好適應變化。您可以在官方網站jsoup.org上獲取更多資訊和當前版本;您可以在連結o7planning.org上閱讀有關類別和方法的更多資訊。我將留下一個指向我的github 的鏈接,在撰寫本文時,有幾個 Telegram 機器人使用 Jsoup 來接收和顯示訊息。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION