繁体   English   中英

使用 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 - 比如不创建另一个 stream 然后将所有结果合并到一个集合中? 也许Jsoup库中的一些正则表达式和另一种方法(似乎.absUrl不适用于正则表达式)可以提供帮助?

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

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

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

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

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

您可以尝试创建 collections 的集合,然后创建 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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM