当前位置: 首页 > news >正文

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 清理功能,使用时需要额外注意安全问题。

相关文章:

  • C#结合html2canvas生成切割图片并导出到PDF
  • JavaScript设计模式 -- 代理模式
  • MySQL基本操作——包含增删查改(环境为Ubuntu20.04,MySQL5.7.42)
  • DVWA-DOM型XSS全等级绕过方法
  • STM32 HAL库 UART串口发送数据实验
  • 新数据结构(10)——Java抽象类和接口
  • DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?
  • 网络安全试题
  • 机器视觉检测中,2D面阵相机和线扫相机的区别
  • 扫描线算法笔记(C++)
  • Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)
  • 架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
  • 基于云计算、大数据与YOLO设计的火灾/火焰目标检测
  • 深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
  • 【网络编程】网络编程基础:TCP/UDP 协议
  • 关于使用雪花算法生成唯一ID,返回给前端ID不一致的问题
  • 图解JVM-1. JVM与Java体系结构
  • 解决DeepSeek服务器繁忙问题:本地部署与优化方案
  • Centos虚拟机扩展磁盘空间
  • 仿 Sora 之形,借物理模拟之技绘视频之彩
  • 商务部:自5月7日起对原产于印度的进口氯氰菊酯征收反倾销税
  • 新闻分析:电影关税能“让好莱坞再次伟大”?
  • 印度扩大对巴措施:封锁巴基斯坦名人账号、热门影像平台社媒
  • 辽宁召开假期安全生产工作调度会:绝不允许层层失守,绝不允许“带病运行”
  • “五一”假期第三天,预计全社会跨区域人员流动量超2.8亿人次
  • 客场不敌蓉城遭遇联赛首败,申花争冠需要提升外援能力