背景
如题,我在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爬虫-优快云博客