JsoupXpath — это анализатор HTML с поддержкой W3C Xpath 1.0, реализованный на чистом Java. Он использует Xpath на основе Antlr4 для разбора HTML и Jsoup для создания DOM-дерева.
JsoupXpath был разработан для того, чтобы предоставить разработчикам в Java доступ к мощному и удобному Xpath, но при этом не найти достаточно хорошего инструмента для анализа.
Реализация JsoupXpath имеет чёткую логику, удобна для расширения и поддерживает полный стандарт W3C XPATH 1.0.
Для получения дополнительной информации о синтаксисе Xpath можно обратиться к файлу Xpath.g4.
Maven-зависимость:
<dependency>
<groupId>cn.wanghaomiao</groupId>
<artifactId>JsoupXpath</artifactId>
<version>2.5.3</version>
</dependency>
Пример использования:
String html = "<html><body><script>console.log('aaaaa')</script><div class='test'>some body</div><div class='xiao'>Two</div></body></html>";
JXDocument underTest = JXDocument.create(html);
String xpath = "//div[contains(@class,'xiao')]/text()";
JXNode node = underTest.selNOne(xpath);
Assert.assertEquals("Two",node.asString());
Другие примеры можно найти в org.seimicrawler.xpath.JXDocumentTest
.
Поддерживает полный стандарт W3C XPATH 1.0. Здесь приведены примеры синтаксического дерева на основе Antlr4, которые демонстрируют способность JsoupXpath обрабатывать выражения и выполнять синтаксический анализ.
//ul[@class='subject-list']/li[./div/div/span[@class='pl']/num()>(1000+90*(2*50))][last()][1]/div/h2/allText()
— пример разбора выражений.//ul[@class='subject-list']/li[not(contains(self::li/div/div/span[@class='pl']//text(),'14582'))]/div/h2//text()
— пример использования встроенных функций.Обратите внимание, что не рекомендуется использовать Xpath, сгенерированный браузерами, такими как Firefox или Chrome, поскольку они могут автоматически дополнять некоторые теги при рендеринге страницы, что может привести к некорректным результатам. Лучше изучить стандартный синтаксис Xpath для эффективного использования его возможностей.
В JsoupXpath реализованы следующие функции:
int position()
— возвращает позицию текущего узла в контексте.int last()
— возвращает позицию последнего узла в контексте.int first()
— возвращает позицию первого узла в контексте.string concat(string, string, string*)
— объединяет строки.boolean contains(string, string)
— проверяет, содержит ли первая строка вторую.int count(node-set)
— подсчитывает количество узлов в заданном наборе.double/long sum(node-set)
— вычисляет сумму значений числовых узлов в наборе, если набор содержит нецифровые элементы, то результат будет недействительным.boolean starts-with(string, string)
— проверяет, начинается ли первая строка со второй.int string-length(string?)
— возвращает длину строки, если она задана, или длину текущего узла, если нет.string substring(string, number, number?)
— извлекает подстроку из заданной строки, начиная с указанного индекса и длиной, указанной параметром. substring("12345", 1.5, 2.6) returns "234"
substring("12345", 2, 3) returns "234":
string substring-ex(string, number, number) — первый параметр указывает на строку, второй — на начальную позицию (в Java обычно начинается с нуля), третий — конечную позицию (поддерживает отрицательные числа). Это функция JsoupXpath, которая расширяет возможности для разработчиков, привыкших к Java.
string substring-after(string, string) — в первой строке извлекает часть после второй строки.
string substring-after-last(string, string) — в первой строке извлекает часть после последнего вхождения второй строки.
string substring-before(string, string) — в первой строке извлекает часть перед второй строкой.
string substring-before-last(string, string) — в первой строке извлекает часть до последнего вхождения второй строки.
date format-date(string, string ,string) — первым параметром является выражение, вторым параметром — значение времени формата выражения, третьим параметром — локаль часового пояса (необязательный).
Разработчики также могут легко и быстро добавлять пользовательские функции, просто реализовав интерфейс org.seimicrawler.xpath.core.Function.java
и вызвав Scanner.registerFunction(Class<? extends Function> func)
во время инициализации системы. JsoupXpath во время выполнения распознаёт и загружает эти функции без необходимости изменения синтаксиса шаблона. Для функций, которые ещё не реализованы в стандартном синтаксисе JsoupXpath, разработчики могут отправлять Pull request в основной репозиторий, чтобы внести свой вклад в проект.
allText() — извлекает весь текст из узла, заменяя рекурсивное использование //div/h3//text()
.
html() — получает внутренний HTML всего узла.
outerHtml() — получает полный HTML, включая сам узел.
num() — извлекает все цифры из собственного текста узла. Если известно, что в собственном тексте узла есть только одно число, например, количество прочтений, комментариев или цена, то можно напрямую извлечь это число. Если есть несколько чисел, будет извлечено первое совпадающее непрерывное число.
text() — извлекает собственный текст узла. Дополнительные сведения см. на странице https://github.com/zhegexiaohuozi/JsoupXpath/releases/tag/v2.4.1.
node() — извлекает все узлы.
AxisName: 'ancestor' //выбирает среди предков текущего узла
| 'ancestor-or-self' //выбирает среди предков и самого текущего узла
| 'attribute' //выполняет операции над атрибутами узла
| 'child' //выбирает дочерние узлы текущего узла (это ось по умолчанию для XPath, например /div/li — это сокращённая запись /div/child::li)
| 'descendant' //выбирает потомков текущего узла
| 'descendant-or-self' //выбирает всех потомков и текущий узел
| 'following' //выбирает все узлы после текущего
| 'following-sibling' //выбирает всех следующих братьев и сестёр текущего узла
| 'parent' //выбирает родителя текущего узла
| 'preceding' //выбирает все узлы перед текущим
| 'preceding-sibling' //выбирает всех предыдущих братьев и сестёр текущего узла
| 'self' //выбирает текущий узел
| 'following-sibling-one' //выбирает следующего брата или сестру (расширение JsoupXpath)
| 'preceding-sibling-one' //выбирает предыдущего брата или сестру (расширение JsoupXpath)
| 'sibling' //выбирает всех братьев и сестёр (расширение JsoupXpath; разработка продолжается)
;
MINUS
: '-';
PLUS
: '+';
DOT
: '.';
MUL
: '*';
DIVISION
: '`div`';
MODULO
: '`mod`';
DOTDOT
: '..';
AT
: '@';
COMMA
: ',';
PIPE
: '|';
LESS
: '<';
MORE_
: '>';
LE
: '<=';
GE
: '>=';
START_WITH
: '^='; // `a^=b` означает, что строка a начинается со строки b (расширение JsoupXpath)
END_WITH
: '$='; // `a*=b` означает, что a содержит b (расширение JsoupXpath)
CONTAIN_WITH
: '*='; // a содержит b (расширение JsoupXpath)
REGEXP_WITH
: '~='; // содержимое a соответствует регулярному выражению b (расширение JsoupXpath)
REGEXP_NOT_WITH
: '!~'; //содержимое a не соответствует регулярному выражению b (расширение JsoupXpath)
В настоящее время существует множество проектов и организаций, активно использующих JsoupXpath. Если ваш проект также использует JsoupXpath и вы хотите быть включены в этот список, пожалуйста, свяжитесь со мной по следующему адресу электронной почты:
Проект или организация: [Название проекта или организации] URL проекта или организации: [URL проекта или организации].
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )