目录
前言
有时候我们可能想获取页面的某些内容,就比如我,需要获取页面的favicon小图标,但是一个个手动去获取太麻烦了,想着能不能试试使用Java解决,一开始我想使用正则表达式来进行匹配处理,但是发现各各网站的路径格式不一样,匹配起来比较麻烦,后面我就发现了jsoup,这是一款Java的HTML解释器,我们可以像使用jquery的方式来使用它,方便便捷!下面给大伙献丑了~
一、引入依赖
首先我们需要引入 jsoup的依赖,这个是重点,另外的hutool是一个工具包,一个很全面的工具包,可以了解下,你会爱上它的!
<!--Java的HTML解释器-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>
<!--工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.15</version>
</dependency>
二、写demo
代码已提供,代码上也有相关的注释,因为每个网站的格式可能会不一样,做了一些你看起来可能多余的处理,这是我测试了多个网站之后改善出来的结果,你可以试着让它更加完善,也希望你能向我提出来,我也想知道更好的方案!
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.net.URL;
public class TestClass {
public static void main(String[] args) {
String faviconUrl = getFaviconUrl("https://baidu.com");
System.out.println("faviconUrl = " + faviconUrl);
}
public static String getFaviconUrl(String str) {
try {
String url = StrUtil.trimToEmpty(str);
// 假设输入的参数不携带协议,则拼接协议
if (!isHttpOrHttps(str)) {
url = StrUtil.format("https://{}", str);
}
URL urlObj = new URL(url);
// 处理出新的url
String newUrl = urlObj.getProtocol().concat("://").concat(urlObj.getHost());
// 发请求
Document document = Jsoup.connect(newUrl).get();
// 筛选包含favicon图标的link标签
Elements title = document.select("link[type=image/x-icon]");
title = ObjectUtil.isEmpty(title) ? document.select("link[rel$=icon]") : title;
// 获取favicon路径
String href = title.attr("href");
// 假设获取到的favicon路径已经包含了域名,则直接返回
if (isHttpOrHttps(href) && StrUtil.containsAny(href, "favicon")) {
return href;
}
// 拼接favicon的访问链接
return StrUtil.format("{}/{}", newUrl, StrUtil.removePrefix(href, "/"));
} catch (IOException i) {
i.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
return "链接无法识别";
}
return "";
}
/**
* 检测是否http或https
*
* @param url URL
* @return 检验是否是http或https
*/
public static boolean isHttpOrHttps(String url) {
String lowerCaseStr = url.toLowerCase();
return lowerCaseStr.startsWith("http:") || lowerCaseStr.startsWith("https:");
}
}
打印结果:
faviconUrl = https://baidu.com/favicon.ico
三、访问效果
让我们来查看一下测试的效果:
总结
写在最后,如果有不明白的地方欢迎评论区导论,也许你的问题解决了别人的疑问呢?
鸣谢
感谢评论区西行呀的博客_CSDN博客-Calcite领域博主 揪出的bug,现已修复
🥇原创不易,还希望各位大佬支持一下!
👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富