问题描述
<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
的屏幕截图。因此,我需要属性srcset
和data-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
解决方法
您可以尝试创建一个集合的集合,然后创建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());