使用 Jsoup 获取所有 img src

Get all img src with Jsoup

我 html 代码包含以下 img src 部分:

<img src="https://lh3.googleusercontent.com/...rw" srcset="https://lh3.googleusercontent.com/...rw 2x" class="T75of DYfLw" width="551" height="310" alt="Screenshot Image"">
<img data-src="https://lh3.googleusercontent.com/...w720-h310-rw" ... data-srcset="https://lh3.googleusercontent.com/... w1440-h620-rw 2x" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="width="551" height="310" alt="Screenshot Image">

我想获取属性为alt=Screenshot Image的所有屏幕截图。所以我需要属性 srcsetdata-srcset 中的值(2 个不同的属性名称 = 2 个不同的案例)。

我写了这段代码:

List<String> src = htmlDocument.select("img[src]").stream()
                .filter(img -> img.attr("alt").equals("Screenshot Image"))
                .map(element -> element.absUrl("data-srcset").replace("2x", ""))
                //or for 1st case
                .map(element -> element.absUrl("srcset")..
                //
                .collect(Collectors.toList());

但现在我无法从第一种情况中获取此值,该属性是 srcset,而不是 data-srcset。我是否可以在不进行额外迭代的情况下获得这两种情况的 src - 比如不创建另一个流然后将所有结果合并到一个集合中?也许 Jsoup 库中的某些正则表达式和另一种方法(似乎 .absUrl 不适用于正则表达式)可以提供帮助吗?

而且我不喜欢带有 replace 的部分(也许某些 src 将包含 2x 作为自己的部分)。

.map(element -> element.absUrl("data-srcset").replace("2x", ""))

但如果没有这种操作,我将得到不正确的 src。

https://lh3.googleusercontent.com/Z...=w1440-h620-rw 2x

我可以用其他方法改进这个 replace 解决方案吗?

您可以尝试创建一个集合的集合,然后创建 flatMap

List<String> src = htmlDocument.select("img[src]").stream()
            .filter(img -> img.attr("alt").equals("Screenshot Image"))
            .map(element -> {
                List<String> url = new ArrayList<>();
                url.add( element.absUrl("data-srcset").replace("2x", ""));
                url.add( element.absUrl("srcset"));
                return url;
            })
            .flatMap(List::stream)
            .collect(Collectors.toList());

对于你的最后一个答案,假设你的 URL 不包含你可以使用的空格

StringUtils.substringBefore(element.absUrl("data-srcset")," ")

编辑

我假设您可以在同一图像中同时使用 srcset 和 data-srcset。再次阅读我最终找到了更好的方法

    List<String> src = htmlDocument.select("img[src]").stream()
                .filter(img -> img.attr("alt").equals("Screenshot Image"))
                .map(element -> StringUtils.isNotEmpty(element.absUrl("srcset")) ? 
                   element.absUrl("srcset") : 
                   element.absUrl("data-srcset").replace("2x", ""))
                .collect(Collectors.toList());