簡體   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