Java获取html标签内容中的图片链接
Java获取html标签内容中的图片链接
一. 正则表达式
代码示例:
private static final Pattern MATCH_IMAGE = Pattern.compile("<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg|\\.bmp|\\.eps|\\.gif|\\.mif|\\.miff|\\.png|\\.tif|\\.tiff|\\.svg|\\.wmf|\\.jpe|\\.jpeg|\\.dib|\\.ico|\\.tga|\\.cut|\\.pic|\\b)\\b)[^>]*>", Pattern.CASE_INSENSITIVE);
/**
* 获取html内容中的图片链接
* @param content html内容
* @return 图片urls链接
*/
public List<String> getImageUrlsFromContentV1(String content) {
List<String> resultList = new ArrayList<>();
if (StringUtils.isBlank(content)) {
return resultList;
}
String htmlCode = content;
Matcher m = MATCH_IMAGE.matcher(htmlCode);
String quote = null;
String src = null;
while (m.find()) {
quote = m.group(1);
src = (quote == null || quote.trim().length() == 0)
? m.group(2).split("//s+")[0]
: m.group(2);
resultList.add(src);
}
return resultList;
}
二. 使用Jsoup(推荐)
(1)导入Jsoup依赖:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version> <!-- 自行选择版本 -->
</dependency>
(2)代码示例:
/**
* 获取html内容中的图片链接
* @param content html内容
* @return 图片urls链接
*/
public List<String> getImageUrlsFromContentV2(String content) {
List<String> resultList = new ArrayList<>();
if (StringUtils.isBlank(content)) {
return resultList;
}
try {
// 解析 HTML
Document doc = Jsoup.parse(content);
// 选择所有 img 标签
Elements imgElements = doc.select("img");
// 提取
for (Element img : imgElements) {
String imgUrl = img.attr("src");
if (StringUtils.isBlank(imgUrl)) {
continue;
}
resultList.add(imgUrl);
}
} catch (Exception e) {
log.error("getImageUrlsFromContentV2 error: {} ", e.getMessage());
}
return resultList;
}
三. 两种方案对比
两种方案相比之下,Jsoup更具有优势:
1. 更准确的 HTML 解析
处理复杂 HTML:Jsoup 能够准确解析复杂的 HTML 结构,包括嵌套标签、不规范的 HTML 等。而正则表达式在处理复杂的 HTML 时可能会因为标签嵌套、不规范的格式等问题导致匹配失败。
容错性:Jsoup 对 HTML 的容错性很强,即使 HTML 代码不规范,也能正确解析。
2. 更直观的选择器语法
CSS 选择器: Jsoup 提供了类似于 CSS 的选择器语法,可以方便地选择 HTML 元素。例如,获取所有图片的链接可以使用 doc.select(“img[src]”)。这种语法简单直观,易于理解和维护。
正则表达式:正则表达式虽然功能强大,但在处理复杂 HTML 时,表达式可能会变得非常复杂,难以维护。
3. 性能优势
优化的解析引擎:Jsoup 的解析引擎经过优化,能够高效处理大型 HTML 文件。虽然在某些情况下,正则表达式的性能可能更高,但在处理复杂的 HTML 结构时,Jsoup 的性能通常更优。
4. 安全性
HTML 清理:Jsoup 在解析 HTML 时会自动清理不安全的内容,例如脚本标签。这有助于防止 XSS 攻击等安全问题。
正则表达式:正则表达式本身不提供 HTML 清理功能,使用时需要额外注意安全问题。