Вопрос
Согласно с этот ответ:
HTML 4.01 указывает, что u003Ca>элементы могут содержать только встроенные элементы. Аu003C/a>u003Cdiv> u003Ca>является элементом блока, поэтому он может не появиться внутри u003Ca>.u003C/a>u003C/a>
Но...
HTML5 позволяет u003Ca>элементам содержать блоки.u003C/a>
Ну, я только что попытался выбрать <div class="m">
внутри <a>
Блок, используя:
Elements elems = a.select("m");
И Элмс возвращается пустым, несмотря на то, что дифта был там.
Поэтому я думаю: либо я не использую правильный синтаксис для выбора Div в рамках a или ... JSoup не поддерживает эту функцию только HTML5?
Какой правильный синтаксис JSoup для выбора div
внутри a
?
Обновлять: Я только что попробовал
Elements elems = a.getElementsByClass("m");
И у Jsoup не было проблем с этим (т.е. он возвращает правильное количество таких DOV в пределах а).
Итак, мой вопрос сейчас: почему?
Почему a.getElementsByClass("m")
работа, тогда как a.select("m")
нет?
Обновлять: Я только что попробовал, за предложение @delan Azabani:
Elements elems = a.select(".m");
И это сработало. Так что в основном a.select()
работает, но мне не хватало .
перед названием класса.
Решение
А select
Функция принимает селектор. Если вы пройдете 'm'
Как аргумент, он попытается найти m
элементы, которые являются детьми a
элемент. Вам нужно пройти '.m'
как аргумент, который найдет элементы с m
класс под a
элемент.
Другие советы
Текущая версия JSoup (1.5.2) поддерживает div
теги вложены внутри a
теги.
В подобных ситуациях я предлагаю распечатать дерево анализа, чтобы убедиться, что JSoup анализировал HTML, как вы ожидаете, или если он не знает, какой правильный селектор использовать.
Например:
Document doc = Jsoup.parse("<a href='./'><div class=m>Check</div></a>");
System.out.println("Parse tree:\n" + doc);
Elements divs = doc.select("a .m");
System.out.println("\nDiv in A:\n" + divs);
Дает:
Parse tree:
<html>
<head></head>
<body>
<a href="./">
<div class="m">
Check
</div></a>
</body>
</html>
Div in A:
<div class="m">
Check
</div>