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

OSCHINA-MIRROR/virjar-sipsoup

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Sipsoup — это реализация XPath на основе Jsoup, которая преобразует синтаксис CSS-запросов в XPath.

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

Автор предполагает, что каждый разработчик фреймворка для сканирования должен реализовать свой собственный XPath, и Sipsoup не стал исключением. При разработке собственного фреймворка VScrawler автор столкнулся с необходимостью выбора инструмента для анализа HTML. В результате он остановился на Sipsoup, так как тот предоставляет гибкие возможности для реализации XPath запросов.

Однако при интеграции Sipsoup были выявлены некоторые недостатки, которые автор попытался исправить. В частности, он хотел добавить возможность проверки синтаксиса во время компиляции XPath-выражений и улучшить поддержку цепочечных запросов.

В результате Sipsoup стал более мощным инструментом для работы с XPath благодаря гибкому расширению и интеграции с Jsoup.

Основные изменения в Sipsoup:

  • Переработаны функции: вместо использования рефлексии для загрузки статических функций из класса, теперь используется интерфейс для расширения функциональности.
  • Добавлена поддержка автоматического сканирования и регистрации функций. Если необходимо расширить собственные функции, их можно поместить в com.virjar.sipsoup.function, чтобы они автоматически регистрировались.
  • Поддержка функций осей (Axis Functions): Sipsoup поддерживает не только обычные предикаты, но и функции осей, а также функции извлечения. Функции могут принимать аргументы.
  • Встроенная функция css позволяет передавать выражения CSS в функцию css, что является значительным достижением Sipsoup. Это упрощает реализацию цепочечного извлечения, сочетающего CSS и XPath запросы.
  • Улучшена поддержка сложных предикатов: Sipsoup предлагает наиболее полное решение для поддержки предикатов, включая вложенные функции, выражения и скобки, обработку пробелов и экранирование. Модуль предикатов был разработан автором за целый день и представляет собой вычислитель.
  • Расширены типы данных предикатов: в синтаксисе XPath определены следующие типы данных: строки, числа, операторы, XPath, функции, значения атрибутов и логические значения. Все типы, кроме операторов, могут быть расширены или удалены. Логический тип был добавлен позже и изначально не планировался, но затем был включён в список стандартных типов.
  • Перегрузка операторов: концепция, знакомая многим по C++. Позволяет переопределить поведение операторов. Например, оператор «+» может выполнять сложение чисел, конкатенацию строк или преобразование чисел в зависимости от типа операндов.
  • Многократное использование XPath: возможность комбинировать несколько XPath выражений для выполнения сложных логических операций, таких как пересечение и объединение множеств.

Демонстрационные примеры включают форматирование текста всех узлов, использование позиции для выбора всех чётных узлов, регистрацию новых функций, регистрацию новых операторов и практическое применение XPath для поиска элементов на веб-странице.

Также приводится пример сложного XPath запроса для извлечения ссылок на изображения из списка с определёнными условиями. Перевод текста на русский язык:

Рассмотрение того, как многие китайские студенты используют webMagic. Встроенный в webMagic xpath — это XSoup. Если вы хотите использовать SipSoup в WebMagic, то это также легко реализуемо. SipSoup предоставляет мост к XSoup.

Несколько строк конфигурации позволят заменить SipSoup на XSoup (см. проект xsoup-to-sipsoup).

Конкретная документация

Функции

Все поддерживаемые функции можно получить через следующий демо-пример (разбор функций демо).

Функции оси:
    * ancestor;
    * ancestorOrSelf;
    * cacheCss;
    * child;
    * css;
    * descendant;
    * descendantOrSelf;
    * followingSibling;
    * followingSiblingOne;
    * parent;
    * precedingSibling;
    * precedingSiblingOne;
    * self;
    * sibling.

Предикатные функции:
    * |abs;
    * |allText;
    * |boolean;
    * |concat;
    * |contains;
    * |false;
    * |first;
    * |hasClass;
    * |last;
    * |lower-case;
    * |matches;
    * |name;
    * |not;
    * |nullToDefault;
    * |parent;
    * |position;
    * |root;
    * |string;
    * |string-length;
    * |substring;
    * |text;
    * |toDouble;
    * |toInt;
    * |true;
    * |try;
    * |upper-case.

Извлекающие функции:
    * allText;
    * @;
    * html;
    * node;
    * num;
    * outerHtml;
    * self;
    * tag;
    * text.

Функции оси

Функции оси определяют область выбора узла в выражении xpath. В выражении xpath ось является необязательной. Однако, если она присутствует, её роль заключается в создании нового набора кандидатов узлов на основе текущего набора узлов. SipSoup сохраняет совместимость с осями стандартного Xpath, но есть одно отличие: оси SipSoup могут принимать параметры, которые в настоящее время ограничены строками. Ось может принимать несколько строковых параметров.

Таблица функций оси:

Функция Параметр Действие
ancestor Нет Все предки узла (отец, дед и т. д.)
ancestorOrSelf Нет Все предки и сам узел
cacheCss Выражение css query Внутреннее перенаправление на select Jsoup, отличается от css axis тем, что cacheCss кэширует правила css. При обработке большого количества похожих веб-страниц одно и то же правило css может использоваться многократно. Кэширование правил css позволяет уменьшить нагрузку на компиляцию и повысить производительность
child Нет Прямой дочерний узел
css Выражение css query Внутреннее перенаправление на select Jsoup
descendant Нет Все потомки узла (дети, внуки и т.д.)
descendantOrSelf Нет Все потомки и сам узел
following-sibling Нет Следующий братский узел
following-sibling-one Нет Возвращает следующего брата (расширение)
parent Нет Родительский узел
preceding-sibling Нет Предыдущий братский узел (предшествующий)
preceding-sibling-one Нет Возврат предыдущего брата (расширение)
self Нет Сам узел
sibling Нет Все братья (расширение)

Извлекающие функции

Извлекающие функции используются для преобразования результатов. Они представляют собой простые функции извлечения данных, такие как извлечение всего текста или определённого атрибута. Извлекающие функции не слишком разнообразны. Результаты извлечения могут быть элементами или строками. Обратите внимание, что если в выражении xpath присутствует извлекающая функция и она возвращает строку, эта функция должна быть конечным узлом в цепочке выражения xpath. Это связано с тем, что при каждом извлечении начинается фильтрация, и элемент будет использоваться только в качестве входных данных для следующего извлечения.

Таблица функций извлечения (кто-нибудь может помочь мне настроить эту таблицу? Выглядит некрасиво, мне не нравится):

Функция Параметр Действие
allText Нет Рекурсивное получение всего чистого текста внутри узла, преобразование блоков html элементов в символы новой строки, сохранение исходной структуры абзацев html, но не макета
@ Нет Извлечение атрибута текущего узла, внутренняя функция данных, недоступная для внешнего вызова, причина в том, что синтаксический анализатор не распознаёт функцию "@", но оператор "@" внутренне преобразуется в функцию извлечения
html Нет Получение внутреннего html всего узла
node Нет Получение html всего узла
num Нет Извлечение всех чисел из собственного текста узла
outerHtml Нет Получение всего html, включая текущий узел
self Нет Отказ от извлечения, сохранение самого себя. По умолчанию xpath обрабатывает дочерние узлы текущего узла. Иногда выражение оси указывает на нужный узел, поэтому нет необходимости использовать функцию извлечения для вычисления нового узла. Используется в ситуациях, когда функция tag не может решить проблему
tag tagName Внутренняя функция, синтаксис xpath tag, по умолчанию направляется на эту функцию обработки //div[@class], здесь div во время выполнения преобразуется в //tag('div')[@'class']. Эти два выражения эквивалентны, но первое выражение является стандартным подходом xpath, и оба выражения имеют одинаковую производительность в SipSoup
text Нет Только получение собственного текстового содержимого узла
allUrl Нет Получение всей информации о ссылках текущего элемента узла, включая следующие теги: a, script, link, img, iframe. Полезно при извлечении статических веб-сайтов

Предикатные функции

Предикатные функции используются в предикатах. Предикатные функции очень мощные, поскольку они могут рекурсивно использовать функции и операторы для создания сложных выражений вычислений.

Таблица предикатных функций:

Функция Параметр Действие
abs Число, может быть целым или десятичным Возвращает абсолютное значение числа. Пример: abs(-3.14) = 3.14
allText Нет Получает весь текст ниже элемента
boolean Число, логическое значение, строка Возвращает логическое значение числа, строки или логического значения. Если параметр отсутствует, по умолчанию возвращается false. Если само значение является логическим, возвращается логическое значение. Если это строка, она пытается преобразоваться в логическое значение. Если это целое число, любое ненулевое значение считается истинным. Остальные целые числа считаются ложными. Все остальные типы данных считаются ложными
concat Несколько параметров, любой тип Объединяет строки. Пример: concat('XPath ','is ','FUN!') = 'XPath is FUN!'
contains Два параметра, обе строки, проверяют, содержит ли левая строка правую строку Если string1 содержит string2, возвращает true, иначе возвращает false
false Нет Возвращает false
first Нет Определяет, является ли элемент первым среди одноуровневых элементов с одинаковым именем
hasClass Строка, имя класса css Имя класса css, фактически вызывает метод hasClass класса Jsoup (преобразователь xpath Jsoup также вызывает этот метод)
last Нет Определяет, является ли элемент последним среди одноуровневых элементов
lower-case Один параметр, строковый тип Преобразует строку в нижний регистр
matches Два параметра, строкового типа Если строка соответствует шаблону, вернуть true, иначе вернуть false. Пример: matches("Merano", "ran") = true
name Нет Получить имя текущего узла
not То же, что и параметр boolean Сначала преобразуйте параметр в логическое значение с помощью функции boolean(). Если логическое значение равно false, верните true, в противном случае верните false
nullToDefault Два параметра любого типа Если первый параметр равен null, третий параметр используется в качестве возвращаемого значения этой функции, в противном случае первый параметр является возвращаемым значением
parent Один или ноль параметров целочисленного типа Если параметр не передан, получить родительский узел текущего узла и вернуть элемент. Если передан параметр, указать n-го предка соответствующего узла
position Один или нулевой параметр типа узла Если параметр не передан или вычисленный результат первого параметра равен null, вернуть позицию текущего узла среди его братьев и сестёр. Иначе вернуть положение переданного узла относительно его братьев и сестёр
root Нет Вернуть корневой узел текущего узла, обычно это узел документа
string-length Один параметр, строковый тип Возвращает длину строки
substring Два или более параметров Первый параметр — строковый тип, второй параметр — число, третий параметр (если есть) также должен быть числовым. Эта функция возвращает соответствующую подстроку. Второй параметр — начальное смещение, если есть третий параметр, то он является конечным смещением, иначе конец равен концу строки
text Нет Получает собственный подтекст элемента
toDouble Один или два параметра, первый должен быть числом, второй (если есть) должен быть типа double Преобразует строку в число типа double, при неудачном преобразовании пытается вернуть значение по умолчанию
toInt Один или два параметра, первый должен быть числом, второй (если есть) должен быть типа int Преобразует строку в число типа int, при неудачном преобразовании пытается вернуть значение по умолчанию
true Нет Возвращает логическое значение true
try Обработка исключений, 0, 1, 2 параметра Если параметр пуст, возвращает true, если первый параметр соответствует синтаксическому узлу без исключения, то возвращает первый параметр. В противном случае возвращает второй параметр (в этом случае, если второго параметра нет, возвращается false)
upper-case Один параметр, тип — строка Преобразовывает строку в нижний регистр

Операторы

В настоящее время операторы связаны с JSoupXpath, их правила операций и JSoupXpath остаются неизменными, SipSoup поддерживает комбинирование нескольких операторов, поэтому возникает проблема приоритета операторов (за исключением очень распространённых случаев использования, обычно рекомендуется использовать скобки для определения приоритета вручную). Операторы и соответствующий приоритет следующие:

Определение приоритета различных операторов

+   :20   Сложение
-   :20   Вычитание
*   :30   Умножение
/   :30   Деление
%   :30   Остаток от деления
&&  :0    Логическое И
||  :0    Логическое ИЛИ
and :0    Логическое И, эквивалентно &&
or  :0    Логическое ИЛИ, эквивалентно ||
=   :10   Равенство, логическая операция
>   :10   Больше, логическая операция
<   :10   Меньше, логическая операция
>=  :10   Больше или равно, логическая операция
<=  :10   Меньше или равно, логическая операция
*=  :10   Содержит, проверяет, содержит ли данные слева данные справа, применимо только к строкам, логическая операция
$=  :10   Заканчивается на, проверяет, заканчиваются ли данные слева данными справа, применимо только к строкам, логическая операция
^=  :10   Начинается с, проверяет, начинаются ли данные слева с данных справа, применимо только к строкам, логическая операция
!=  :10   Не равно, противоположно «=», логическая операция
~=  :10   Соответствие шаблону, проверяет, соответствуют ли данные слева регулярному выражению справа, применимо только к строкам, логическая операция
!~  :10   Несоответствие, противоположность «~=», если данные слева не соответствуют регулярному выражению справа, возвращает true

Типы операторов

Вычисления с операторами включают вопросы повышения типов данных, например, когда данные целого типа и данные длинного целого типа вычисляются вместе, они преобразуются в данные длинного целого типа. SipSoup по умолчанию поддерживает следующие типы чисел: int, long, double (float обрабатывается как double), BigDecimal, и будет обрабатывать преобразование типов в соответствии с общими правилами.

Следует отметить, что у оператора «+» есть две функции: если встречается число, выполняется сложение чисел, а если встречается строка, выполняется объединение строк. Если вы считаете, что это поведение не должно существовать, вы можете изменить его, переписав оператор.

Расширенное использование

  1. Регистрация или перезапись новых функций RegisterNewFunctionTest.java
  2. Регистрация или перезапись новых операторов перегрузка операторов
  3. Регистрация новых типов данных TokenAnalysisRegistry.java. Здесь подробности не приводятся. Если вам нужна эта функция, вы должны достаточно хорошо понимать исходный код SipSoup, чтобы самостоятельно управлять этим классом и распознавать новый формат типа данных в соответствии со спецификациями SipSoup и преобразовывать его в модель узла характеристик для потребления.

Комментарии ( 0 )

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

Введение

Sipsoup — это реализация на основе Jsoup, которая включает в себя часть синтаксиса cssQuery из Jsoup в виде xpath. Она позволяет выполнять внутри xpath смешанные запросы, сочетающие cssQuery и xpath, по цепочке документов. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/virjar-sipsoup.git
git@api.gitlife.ru:oschina-mirror/virjar-sipsoup.git
oschina-mirror
virjar-sipsoup
virjar-sipsoup
master