Spring Boot集成jsoup實現html解析

1.什么是jsoup

jsoup 是一款 Java 的 HTML 解析器,可直接解析某個 URL 地址、HTML 文本內容。它提供了一套非常省力的 API,可通過 DOM,CSS 以及類似于 jQuery 的操作方法來取出和操作數據,可操作 HTML 元素、屬性、文本。 ?

JSoup 功能

jsoup 實現 WHATWG HTML5 規范,并將 HTML 解析為與現代瀏覽器相同的 DOM。

  • 從 URL,文件或字符串中提取并解析 HTML。
  • 查找和提取數據,使用 DOM 遍歷或 CSS 選擇器。
  • 操縱 HTML 元素,屬性和文本。
  • 根據安全的白名單清理用戶提交的內容,以防止 XSS 攻擊。
  • 輸出整潔的 HTML。

JSoup 主要類

大多數情況下,下面給出?3?個類是我們需要重點了解的。

Jsoup 類

Jsoup 類是任何 Jsoup 程序的入口點,并將提供從各種來源加載和解析 HTML 文檔的方法。 Jsoup 類的一些重要方法如下:

方法描述
static Connection connect(String url)創建并返回 URL 的連接。
static Document parse(File in, String charsetName)將指定的字符集文件解析成文檔。
static Document parse(String html)將給定的 html 代碼解析成文檔。
static String clean(String bodyHtml, Whitelist whitelist)從輸入 HTML 返回安全的 HTML,通過解析輸入 HTML 并通過允許的標簽和屬性的白名單進行過濾。

Jsoup 類的其他重要方法可以參見 -?Jsoup: jsoup HTML Parser Documentation

Document 類

該類表示通過 Jsoup 庫加載 HTML 文檔。可以使用此類執行適用于整個 HTML 文檔的操作。 Element 類的重要方法可以參見 -?Document: jsoup HTML Parser Documentation?。

Element 類

HTML 元素是由標簽名稱,屬性和子節點組成。 使用 Element 類,您可以提取數據,遍歷節點和操作 HTML。 Element 類的重要方法可參見 -?Element: jsoup HTML Parser Documentation?。

2.代碼工程

實驗目的

實現解析liuhaihua.cn首頁list

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>jsoup</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency></dependencies>
</project>

controller

package com.et.jsoup;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
public class HelloWorldController {@RequestMapping("/hello")public Map<String, Object> showHelloWorld(){Map<String, Object> map = new HashMap<>();map =JsoupUtil.parseHtml("http://www.liuhaihua.cn/");map.put("msg", "HelloWorld");return map;}
}

工具類

package com.et.jsoup;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;/*** @author liuhaihua* @version 1.0* @ClassName JsoupUtil* @Description todo* @date 2024/06/24/ 9:16*/public class JsoupUtil {public static Map<String ,Object> parseHtml(String url){Map<String,Object> map = new HashMap<>();//1.生成httpclient,相當于該打開一個瀏覽器CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;//2.創建get請求,相當于在瀏覽器地址欄輸入 網址HttpGet request = new HttpGet(url);//設置請求頭,將爬蟲偽裝成瀏覽器request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
//        HttpHost proxy = new HttpHost("60.13.42.232", 9999);
//        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
//        request.setConfig(config);try {//3.執行get請求,相當于在輸入地址欄后敲回車鍵response = httpClient.execute(request);//4.判斷響應狀態為200,進行處理if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//5.獲取響應內容HttpEntity httpEntity = response.getEntity();String html = EntityUtils.toString(httpEntity, "utf-8");System.out.println(html);/*** 下面是Jsoup展現自我的平臺*///6.Jsoup解析htmlDocument document = Jsoup.parse(html);//像js一樣,通過標簽獲取titleSystem.out.println(document.getElementsByTag("title").first());Elements blogmain = document.getElementsByClass("col-sm-8 blog-main");//像js一樣,通過class 獲取列表下的所有博客Elements postItems =  blogmain.first().getElementsByClass("fade-in");//循環處理每篇博客List<Map>  list =  new ArrayList<>();for (Element postItem : postItems) {Map<String,Object> row = new HashMap<>();//像jquery選擇器一樣,獲取文章標題元素Elements titleEle = postItem.select(".entry-title a");System.out.println("文章標題:" + titleEle.text());;row.put("title",titleEle.text());System.out.println("文章地址:" + titleEle.attr("href"));row.put("href",titleEle.attr("href"));//像jquery選擇器一樣,獲取文章作者元素Elements footEle = postItem.select(".archive-content");System.out.println("文章概要:" + footEle.text());;row.put("summary",footEle.text());Elements view = postItem.select(".views");System.out.println( view.text());row.put("views",view.text());System.out.println("*********************************");list.add(row);}map.put("data",list);} else {//如果返回狀態不是200,比如404(頁面不存在)等,根據情況做處理,這里略System.out.println("返回狀態不是200");System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//6.關閉HttpClientUtils.closeQuietly(response);HttpClientUtils.closeQuietly(httpClient);}return  map;}public static void main(String[] args) {parseHtml("http://www.liuhaihua.cn/");}}

DemoApplication.java

package com.et.jsoup;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

以上只是一些關鍵代碼,所有代碼請參見下面代碼倉庫

代碼倉庫

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.

3.測試

  • 啟動spring boot應用
  • 訪問http://127.0.0.1:8088/hello,返回解析結果

4.引用

  • 官網:jsoup: Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety
  • GitHub:GitHub - jhy/jsoup: jsoup: the Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety.
  • Spring Boot集成jsoup實現html解析 | Harries Blog?

? ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35502.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

函數內部結構分層淺析(從MVC分層架構聯想)

函數內部結構分層淺析&#xff08;從MVC分層架構聯想&#xff09; 分層架構:一種將軟件代碼按不同功能進行劃分的架構模式。 優點包括&#xff1a; 可維護性&#xff1a;各層職責明確&#xff0c;易于單獨修改維護。 可擴展性&#xff1a;方便添加或修改某一層&#xff0c;不…

優化Java應用的日志記錄方法

優化Java應用的日志記錄方法 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 引言 在開發和維護Java應用程序時&#xff0c;良好的日志記錄是確保應用穩定性和…

優化Java中網絡通信的性能策略

優化Java中網絡通信的性能策略 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代軟件開發中&#xff0c;優化網絡通信的性能是確保應用程序高效運行的關鍵…

Rocketmq在單節點情況下新增從節點

Rocketmq在單節點情況下新增從節點 在docker-compose部署rocketmq單節點的基礎上&#xff0c;新增一個從節點 一&#xff0c;修改docker-compose配置文件 原docker-compose文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:server-4.5.2container_name: rm…

選擇診所管理系統的原則是什么?

如今&#xff0c;診所管理系統已成為醫療機構提升管理效率、優化患者服務的重要工具。然而&#xff0c;市場上的診所管理系統琳瑯滿目&#xff0c;功能各異&#xff0c;因此&#xff0c;如何選擇一款適合自己診所的管理系統&#xff0c;是許多診所管理者需要思考的問題。下面&a…

進程調度的基本過程

文章目錄 CPU執行指令過程進程PCB“分時復用” ??結語 CPU執行指令過程 一個CPU能執行那些指令&#xff0c;可以認為是cpu最初設計的時候就已經寫死了。有一個“表格”描述了都有哪些指令。 以上的表格只是一個簡化版本&#xff0c;真實的cpu指令表要復雜很多。此處假設每個…

RUC2024《綜合設計》期中測試

T1 原題鏈接https://www.luogu.com.cn/problem/P1025 不是我出的 T2 原題鏈接&#xff1a;https://www.luogu.com.cn/problem/P26787 這道題就是講過的二分貪心&#xff0c;先二分規定每兩個點之間都必須大于等于某個值&#xff0c;然后依次枚舉通過貪心求出最少需要刪除的點數…

薄冰英語語法學習--名詞2-格

名詞后面 s&#xff0c;代表后面這個東西屬于前面的。 比如toms book&#xff0c;湯姆的書。 末尾是s&#xff0c;那么直接在最后加就行了。比如boys&#xff0c;男孩們的 表示幾個詞共同 的所有關系在最后一個詞的詞尾加 sMary and Toms books 瑪麗和湯姆共有的書表示幾個詞…

深入探討C++的高級反射機制

反射是一種編程語言能力&#xff0c;允許程序在運行時查詢和操縱對象的類型信息。它廣泛應用于對象序列化、遠程過程調用、測試框架、和依賴注入等場景。 由于C語言本身的反射能力比較弱&#xff0c;因此C生態種出現了許多有趣的反射庫和實現思路。我們在本文一起探討其中的奧秘…

DOM遍歷

DOM 遍歷是指在 HTML 文檔中導航和定位元素的過程。通過 DOM 遍歷&#xff0c;您可以在文檔中移動并查找特定的元素&#xff0c;以便對其進行操作或者檢索信息。 尋找子元素 //DOM遍歷 const h1 document.querySelector(h1);//尋找子元素 console.log(h1.querySelectorAll(.…

每天一個數據分析題(三百九十)- 多元線性回歸

在多元線性回歸中&#xff0c;下列哪項可以緩解多重共線性問題&#xff1f; A. 取對數 B. 平方 C. 去除異常值 D. 逐步回歸 數據分析認證考試介紹&#xff1a;點擊進入 題目來源于CDA模擬題庫 點擊此處獲取答案 數據分析專項練習題庫 內容涵蓋Python&#xff0c;SQL&am…

從入門到精通:使用Python的Watchdog庫監控文件系統的全面指南

從入門到精通&#xff1a;使用Python的Watchdog庫監控文件系統的全面指南 引言Watchdog庫概述核心組件工作原理 快速開始&#xff1a;設置Watchdog安裝Watchdog創建一個簡單的監控腳本設置和啟動Observer 事件處理&#xff1a;如何響應文件系統的變化基本事件處理處理復雜的場景…

論文生成新紀元:探索頂尖AI寫作工具的高效秘訣

在學術探索的征途中&#xff0c;AI論文工具本應是助力前行的風帆&#xff0c;而非讓人陷入困境的漩渦。我完全理解大家在面對論文壓力的同時&#xff0c;遭遇不靠譜AI工具的沮喪與無奈。畢竟&#xff0c;時間可以被浪費&#xff0c;但金錢和信任卻不可輕棄。 作為一名資深的AI…

@Transactional(rollbackFor = Exception.class)注解

當作用于類上時&#xff0c;該類的所有 public 方法將都具有該類型的事務屬性&#xff0c;同時&#xff0c;我們也可以在方法級別使用該標注來覆蓋類級別的定義。 在項目中&#xff0c;Transactional(rollbackForException.class)&#xff0c;如果類加了這個注解&#xff0c;那…

Java使用Graphics2D畫圖,畫圓,矩形,透明度等實現

背景 如上圖&#xff0c;需要使用Java生成一個圖片&#xff0c; 并以base64編碼的形式返回給前端展示。 使用Graphics2D類&#xff0c;來進行畫圖&#xff0c;其中需要畫方框、原型、插入圖標、寫入文字等&#xff0c;同時需要設置透明度等細節點 環境&#xff1a;Jdk17&#…

Java面試八股之JVM內存泄漏按照發生的方式可以分為哪幾類

JVM內存泄漏按照發生的方式可以分為哪幾類 常發性內存泄漏&#xff08;Frequent Memory Leak&#xff09; 這類內存泄漏發生的代碼會被頻繁執行&#xff0c;每次執行時都會導致一塊或多塊內存無法被回收。由于泄漏行為重復發生&#xff0c;故稱為常發性。這類泄漏通常比較容易…

下一代廣域網技術2:SRv6

2.SRv6 SR架構設計之初&#xff0c;就為SR數據平面設計了兩種實現方式&#xff1a;一種是SR-MPLS&#xff0c;其重用了MPLS數據平面&#xff0c;可以在現有IP/MPLS網絡上增量部署&#xff1b;另一種是SRv6&#xff0c;使用IPv6數據平面&#xff0c;基于IPv6路由擴展頭進行擴展…

Docker部署常見應用之Oracle數據庫

文章目錄 安裝部署參考文章 安裝部署 使用Docker安裝Oracle數據庫是一個相對簡便的過程&#xff0c;可以避免在本地環境中直接安裝Oracle數據庫的復雜性。 安裝Docker環境&#xff1a;確保你的系統上已經安裝了Docker&#xff0c;并且Docker服務正在運行。具體的安裝方法可以根…

使用North自部署圖床服務

圖床 圖床可以把圖片轉為鏈接&#xff0c;從而方便我們書寫、分享博客&#xff0c;目前圖床主要分為以下幾類: 利用 Git 倉庫存儲對象存儲&#xff08;OSS、COS、七牛云等&#xff09;免費公共圖床&#xff08;SM.MS、聚合圖床、ImgTP、Postimage等&#xff09; 但上述圖床都…

低應變復習題

1.比較臨塑荷載、臨界荷載和極限荷載的大小( ) A、臨塑荷載<臨界荷載<極限荷載 B、臨塑荷載>臨界荷載<極限荷載 C、臨塑荷載<臨界荷載>極限荷載 D、臨塑荷載>臨界荷載>極限荷載 參考答案:A 2.面關于低應變反射波法的描述,正確的是:( ) A、反射…