JSoup - Выбрать изображения не внутри ссылки - PullRequest
1 голос
/ 14 мая 2019

Как выбрать все изображения, которые не находятся внутри элемента ссылки?

document.select("a img"); //selects all images inside a link
document.select(":not(a) img"); //images not inside a link (does not work)

1 Ответ

1 голос
/ 15 мая 2019

Хорошо, проблема в том, что :not(a) img нужен только один элемент вокруг <img>, который не является <a>, содержащим <img>.Например, <body> соответствует :not(a).Таким образом, ваш селектор соответствует почти всем тегам <img>.Даже если вы передаете строку HTML в Jsoup.parse(), в которой нет тега <body> или <html>.Jsoup генерирует его автоматически.

Предположим, у нас есть следующий HTML-код:

<html>
  <body>
    <a><div><img id="a-div-img"></div></a>
    <a><img id="a-img"></a>
    <img id="img">
  </body>
</html>

Если вы просто хотите исключить прямые <img> дочерние элементы в <a>, вы можете использовать :not(a) > img какселектор:

Elements images = document.select(":not(a) > img");

Результат будет таким:

<img id="a-div-img">
<img id="img">

Проблема в том, что он также печатает первый <img> примера, который на самом деле находится внутри <a> (#a-div-img).Если этого достаточно для удовлетворения ваших потребностей, вы можете воспользоваться этим решением.

Исключить все теги <a> из выбора невозможно с помощью чистого CSS (по крайней мере, я пока не нашел решения).Но вы можете просто удалить все теги <a> из документа, прежде чем выбрать все теги <img>:

document.select("a").remove();
Elements images = document.select("img");

Результат будет следующим:

<img id="img">

Если вам нужноИсходный документ без изменений вы можете использовать Document.clone() до:

Document tempDocument = document.clone();
tempDocument.select("a").remove();
Elements images = tempDocument.select("img");

При использовании этого исходный документ никогда не изменяется.

...