1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-Jsoupxpath_old1

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 22:23 f6fa7cd

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 в основной репозиторий, чтобы внести свой вклад в проект.

NodeTest:

  • 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-Jsoupxpath_old1.git
git@api.gitlife.ru:oschina-mirror/mirrors-Jsoupxpath_old1.git
oschina-mirror
mirrors-Jsoupxpath_old1
mirrors-Jsoupxpath_old1
master