SpringBoot(九)使用Jsoup解析html字符串

233 阅读4分钟

目前在做博客相关的功能,在显示文章详情的时候,我看到那些大的博客社区,文章中的图片都是可以点击放大的,我感觉这个功能非常好,我也想做,在PHP版本的博客中已经实现了。

 

实现原理其实很简单,使用PHP的simple_html_dom库解析HTML字符串,找到其中的img标签,在img标签上添加onclick点击方法。在前端的html中编写好对应的点击方法,即可实现点击图片放大的效果。

 

那么在java中我该如何实现呢?

 

实现思路参照PHP版本的实现思路就可以。现在我需要的是找到一个java的解析html字符串的库。他就是Jsoup

 

一:引入jar包

<dependency>
     <groupId>org.jsoup</groupId>
     <artifactId>jsoup</artifactId>
     <version>1.15.3</version>
 </dependency>

**
**

二:Jsoup基本使用介绍

Jsoup解析html一般都是web爬虫使用。Jsoup需要将爬下来的数据解析出来,成为我们要的数据。

 

1:加载数据的三种方式:

(1):从url中加载html

Document document = Jsoup.connect("https://guanchao.site/pc/placeOnFile").get();
 System.out.println(document.title());

 

(2):从文件中加载html

Document document = Jsoup.parse( new File( "c:/temp/demo.html" ) , "utf-8" );
 System.out.println(document.title());

 

(3):从字符串中加载html

String html = "<html><head><title>First parse</title></head>"
         + "<body><p>Parsed HTML into a doc.</p></body></html>";
 Document document = Jsoup.parse(html);
 System.out.println(document.title());

2:使用DOM定位元素

查找元素-下列方法返回的是Element或Elements

getElementById(String id):通过id来查找元素

getElementsByTag(String tag):通过标签来查找元素

getElementsByClass(String className):通过类选择器来查找元素

getElementsByAttribute(String key) :通过属性名称来查找元素,例如查找带有href元素的标签。

siblingElements():获取兄弟元素。如果元素没有兄弟元素,则返回一个空列表。

firstElementSibling():获取第一个兄弟元素。

lastElementSibling():获取最后一个兄弟元素。

nextElementSibling():获取下一个兄弟元素。

previousElementSibling():获取上一个兄弟元素。

parent():获取此节点的父节点。

children():获取此节点的所有子节点。

child(int index):获取此节点的指定子节点。

 

3:css选择器方式

tagname: 通过标签查找元素,例如通过"a"来查找< a >标签。

#id: 通过ID查找元素,比如通过#logo查找< p id=“logo”>

.class: 通过class名称查找元素,比如通过.titile查找< p class=“titile”>

ns|tag: 通过标签在命名空间查找元素,比如使用 fb|name 来查找 < fb:name>

[attribute]: 利用属性查找元素,比如通过[href]查找< a href=“…”>

[ ^attribute]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 dataset属性的元素

[ attribute=value]: 利用属性值来查找元素,比如:[ width=500]

[attribute^=value], [attribute$=value], [attribute*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如通过[href*=/path/]来查找

[attribute~=regex]: 利用属性值匹配正则表达式来查找元素,比如通过 img[src~=(?i).(png|jpe?g)]来匹配所有的png或者jpg、jpeg格式的图片

*: 通配符,匹配所有元素

 

4:组合使用

例如:Elements elements = doc.select(“div.css_tr_event”);

 

el#id: 元素+ID,比如: div#logo

el.class: 元素+class,比如: div.masthead

el[attr]: 元素+class,比如 a[href]匹配所有带有 href 属性的 a 元素。

任意组合,比如:a[href].highlight匹配所有带有 href 属性且class="highlight"的 a 元素。

ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有 p元素,中间有一个空

parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素

siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div

siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p

el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo

 

当然,我这里用不上这么复杂,dom标签选择器就够,遇到了就先了解一下。以后用到了再仔细看。

 

5:获取数据

attr(String key):获取单个属性值

attributes():获取所有属性值

attr(String key, String value):设置属性值

text():获取文本内容

text(String value):设置文本内容

html():获取元素内的HTML内容

html(String value):设置元素内的HTML内容

outerHtml():获取元素外HTML内容

data():获取数据内容(例如:script和style标签)

id():获得id值(例:

衣服

 

className():获得第一个类选择器值

classNames():获得所有的类选择器值

tag():获取元素标签

tagName():获取元素标签名

 

6:操作HTML文本

append(String html):在末尾追加HTML文本

prepend(String html):在开头追加HTML文本

html(String value):在匹配元素内部添加HTML文本。

 

最后,放一下官方文档:

jsoup.org/apidocs/org…

 

有好的建议,下方输入你的评论。