使用Jsoup获取所有img src

问题描述

我有以下img src部分的HTML代码

<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。是否可以在没有附加迭代的情况下获得两种方案的srcs-例如不创建另一个流,然后将所有结果组合到一个集合中?也许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());

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

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());