Хорошо, проблема в том, что :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");
При использовании этого исходный документ никогда не изменяется.