Spring Boot集成jsoup实现html解析
myzbx 2024-12-24 14:28 17 浏览
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 类的其他重要方法可以参见 - https://jsoup.org/apidocs/org/jsoup/Jsoup.html
Document 类
该类表示通过 Jsoup 库加载 HTML 文档。可以使用此类执行适用于整个 HTML 文档的操作。 Element 类的重要方法可以参见 - http://jsoup.org/apidocs/org/jsoup/nodes/Document.html 。
Element 类
HTML 元素是由标签名称,属性和子节点组成。 使用 Element 类,您可以提取数据,遍历节点和操作 HTML。 Element 类的重要方法可参见 - http://jsoup.org/apidocs/org/jsoup/nodes/Element.html 。
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解析html
Document document = Jsoup.parse(html);
//像js一样,通过标签获取title
System.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);
}
}
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
- https://github.com/Harries/springboot-demo
3.测试
- 启动spring boot应用
- 访问http://127.0.0.1:8088/hello,返回解析结果
4.引用
- 官网:https://jsoup.org/
- GitHub:https://github.com/jhy/jsoup/
- http://www.liuhaihua.cn/archives/710776.html
相关推荐
- Fabric.js使用说明详解(fabric nodejs)
-
Fabric介绍简介:Fabric是一款基于HTML5Canvas的开源绘图库,它提供了丰富的API和工具,可以轻松地创建交互式的绘图应用程序和游戏。功能特点:介绍Fabric的核心功能,如图形绘制...
- 如何才能快速将照片变成漫画?(如何才能快速将照片变成漫画风格)
-
本文分享8个超级详细的照片变漫画教程,让你秒变绘画大师,跟着教程就能亲手将自己的照片制作成精美的漫画,快来一起试试吧~1、PS一款专业的图像处理软件,具备出色的图像处理功能,提供了强大的编辑工具和广...
- 很少人知道的20个最好用的免费设计软件
-
不是每个人都能花重金去购置昂贵的软件来装备自己,特别是在刚开始涉足设计这个行业的新手们。我们知道adobe系列软件正版是收费的,而且很贵,虽然说我们国内已经能破解使用,很多人都认为adobe的那些软件...
- 13个免费的信息图表制作软件推荐(如何制作信息表)
-
制作信息图表涉及大量的工作,如:数据收集,数据排列,选择和规划信息图表的格式和设计信息图表。在设计信息图表时,选择适当的制图软件是一个非常艰巨的任务。下面为大家推荐13个最好的免费信息图表制作软件。A...
- 怎么转换图片的格式?(怎么转换图片的格式)
-
我们日常用到最多的图片格式是JPG/JPEG格式的,其他常见的图片格式包括有bmp,png,tif,gif,svg,cdr,ai,raw,webp等,由于图片的使用场景不同,所以要求的具体格式也会有所...
- Adobe的各种图形处理软件分别是做什么的
-
Adobe公司的Ps,Pr,Ae,An,Ai软件分别的用来做什么的?PS:AdobePhotoshop的简称,用于图像处理、编辑、通道、图层、路径综合运用,图像色彩的校正,各种特效滤镜的使用、特效字...
- 前端开发中,对图片的优化技巧有哪些?
-
按照先后顺序有以下:1.去掉无意义的修饰。嗯,我会瞎说吗?除了内容图片,其他的图片的作用是修饰,也就是对于传达信息来说并非本质性的。最大的优化就是压根不要图片!所以在优化之前要做的,首先是确认设计,...
- Adobe软件的最佳Linux替代品有哪些?这几款工具不容错过
-
如果你是一名平面设计工作者,那么估计很多与你职业相同或者是喜欢并正在学习平面设计的小伙伴们,而如果恰巧你们都是Linux用户的话,那么估计很多的小伙伴都在寻找Adobe的Linux替代品吧。但是,...
- 精心收集几个免费绘图、修图与照片编辑软件分享一下
-
本次为大家介绍几款绘图、修图与照片编辑软件,都可以免费授权个人与教育使用,有些开源软件甚至可以在工作上商业使用。其中大多数的绘图软件都是跨平台的,可以在Windows或Mac上安装,对个人照片...
- UI设计入门干货!八大软件+技能+素材网站
-
随着互联网行业的发展,UI设计师越来越多的被提及,UI设计师大火,需求岗位越来越多,也有越来越多的人转行投身UI设计师。UI设计是什么?一般所说的UI设计多指UI视觉设计,主要负责APP、Web、H5...
- 干货!一文读懂10种主流的图片格式
-
JPG、PNG、GIF,这些在我们生活中常见的图片格式,你真的了解它们吗?你知道除了这3种图片格式外,还有十多种主流的图片格式吗?每一种图片格式都有自己的特点和适用场景,选择正确的图片类型不仅能提升视...
- 最佳设计:A-Frame,阅读进度指示器,Colorify.js,交互式讲故事
-
最佳设计和开发好东西的综述以及一些新版本-第44期(2015年最后一期),包括A-Frame,阅读进度指示器,Colorify.js,交互式讲故事的动画地图路径,简单的Ionic侧菜单过渡等。摇滚...
- 当爆火的“粘土风”吹进铁路......
-
展播开始啦⑨<animateattributeName="opacity"begin="0s"dur="0.01"fill="freeze"from="1"to="1"/>&l...
- 日日是好日:书法艺术文字T恤定制,陶冶性情、现代生活新平衡
-
书法,心情和思想都融入文字的意境当中,对眼前或身边发生的不愉快事情视而不见、听而不闻,从而进入既轻松又舒适的状态,没有了妄念和烦恼,精神获得享受。本文节选自《DIYSKU个性化定制设计按需印刷行业出海...
- 从默默无闻到无可替代,Photoshop背后藏着多少不为人知的故事 ?
-
1990年2月推出了photoshop1.0。当时Photoshop只能在Mac计算机上运行,功能上也只有“工具”面板和少量的滤镜。1991年2月推出了photoshop2.0。该版本发行引发了桌...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)