JsoupXpath — это анализатор HTML, написанный на чистом Java и использующий синтаксис XPath 1.0 для извлечения данных из HTML. Он основан на Jsoup и Antlr4.
Основные особенности:
Разработан для тех, кто хочет использовать XPath в Java, но не может найти подходящий инструмент.
Синтаксис описан в файле 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.
В качестве примера представлены два выражения:
//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 из браузера, так как он может быть специфичным для конкретного браузера и не всегда является универсальным решением.
Функции:
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?)
— первый параметр указывает строку, второй — начальную позицию (индексация XPath начинается с 1), третий — длину подстроки (здесь важно отметить, что это не конечная позиция). substring("12345", 1.5, 2.6) returns "234"
substring("12345", 2, 3) returns "234":
string substring-ex(string, number, number) — первый параметр указывает на строку, второй — на начальную позицию (в Java обычно начинается с 0), третий — конечную позицию (поддерживает отрицательные числа). Это функция 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 широко используется в следующих проектах или организациях: SeimiCrawler. Если ваш проект также использует JsoupXpath и вы хотите, чтобы он был включён в этот список, пожалуйста, свяжитесь со мной по следующему адресу:
Название проекта или организации: XX
URL проекта или организации: http://xxx.xxx.cc
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )