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?
? ?