使用 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
的所有屏幕截图。所以我需要属性 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
。我是否可以在不进行额外迭代的情况下获得这两种情况的 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());
我 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
的所有屏幕截图。所以我需要属性 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
。我是否可以在不进行额外迭代的情况下获得这两种情况的 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());