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

OSCHINA-MIRROR/xiaohuo-JsoupXpath

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

JsoupXpath — это анализатор HTML, написанный на чистом Java и использующий синтаксис XPath 1.0 для извлечения данных из HTML. Он основан на Jsoup и Antlr4.

Основные особенности:

  • полностью реализует синтаксис W3C XPath 1.0;
  • использует Lexer и Parser на основе Antlr4;
  • генерирует DOM-дерево с помощью Jsoup.

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

В качестве примера представлены два выражения:

  1. //ul[@class='subject-list']/li[./div/div/span[@class='pl']/num()>(1000+90*(2*50))][last()][1]/div/h2/allText() — пример выражения с вложенными операциями.
  2. //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 в основной репозиторий и вносить свой вклад в проект.

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 широко используется в следующих проектах или организациях: SeimiCrawler. Если ваш проект также использует JsoupXpath и вы хотите, чтобы он был включён в этот список, пожалуйста, свяжитесь со мной по следующему адресу:

Название проекта или организации: XX
URL проекта или организации: http://xxx.xxx.cc

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/xiaohuo-JsoupXpath.git
git@api.gitlife.ru:oschina-mirror/xiaohuo-JsoupXpath.git
oschina-mirror
xiaohuo-JsoupXpath
xiaohuo-JsoupXpath
master