Java使用Jsoup解析html网页

背景

如题,我在Maven的中央索引仓库拿到的数据如下:

业务需求:拆出 u=aws.sdk.kotlin|acmpca|1.0.3|kotlin-tooling-metadata|json.sha256 里面的数据,又需要下一行对应的时间,还得把它们存在一起。

分析图例,已知<a> 标签是 <pre> 标签的直接子节点,应保留;文本节点应过滤。

代码

核心部分

// 解析 HTML 数据,使用Jsoup的parse()方法,解析 HTML 字符串。该方法返回一个 HTML 文档
Document doc = Jsoup.parse(htmlContent);

// 从该文档中获取具有特定ID("contents")的元素
Element preElement = doc.getElementById("contents");

// 获取该元素下的所有子节点,以List<Node>的形式返回
List<Node> nodes = preElement.childNodes();

for (Node node : nodes) {
     // 检查子节点是否是元素类型(因为包含了文本节点)
     if (node instanceof Element) {
     // 转类型
     Element element = (Element) node;
     // 获取该元素中herf属性的值
     String hrefValue = element.attr("href");
}

套进场景的情况

private final String baseUrl = "https://xxx/";
private final RestTemplate restTemplate;

public boolean fetchWebContent() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Map<String, Timestamp> map = new HashMap<>();
        String key = null;

        try {
            ResponseEntity<String> responseEntity = restTemplate.getForEntity(baseUrl, String.class);
            String htmlContent = responseEntity.getBody();

            // 处理获取到的网页内容
            Document doc = Jsoup.parse(htmlContent);
            Element preElement = doc.getElementById("contents");
            List<Node> nodes = preElement.childNodes();

            // 是否符合添加时间戳条件的标志(上一个数包含gz
            boolean shouldAddTimestamp = false;

            for (Node node : nodes) {
                if (node instanceof Element) {
                    Element element = (Element) node;
                    String hrefValue = element.attr("href");

                    if (hrefValue.endsWith("gz")) {
                        shouldAddTimestamp = true;
                        key = hrefValue;
                        map.put(key, null);
                    }
                } else if (node.toString().trim().contains("-") && shouldAddTimestamp) {
                    // 找符合要求的数据(时间
                    Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}");
                    Matcher matcher = pattern.matcher(node.toString().trim());

                    if (matcher.find()) {
                        String timestampString = matcher.group(0); // 提取匹配的内容,使用 group(0) 获取整个匹配的文本
                        Date parsedDate = dateFormat.parse(timestampString);
                        Timestamp timestamp = new Timestamp(parsedDate.getTime());
                        map.put(key, timestamp);

                        // 已经用完这次的状态了,归零
                        shouldAddTimestamp = false;
                        key = null;
                    } else {
                        System.out.println("未找到匹配的时间戳");
                    }
                }
            }  
    //剩余业务代码...
}

 Jsoup

Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM、CSS 以及类似于 JQuery 的操作方法来取出和操作数据。官方网站为 jsoup.org 。

Jsoup可以从一个URL,文件或字符串中解析HTML;也可以操作HTML元素、属性、文本。

Jsoup更多使用方法介绍请参考这篇博客:java爬虫——JSoup_jsoup爬虫-CSDN博客

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值