Sipsoup — это реализация XPath на основе Jsoup, которая преобразует синтаксис CSS-запросов в XPath.
Sipsoup — это анализатор HTML, разработанный на чистом Java и использующий XPath для разбора. Он полностью независим от анализатора DOM, который генерируется с помощью Jsoup.
Автор предполагает, что каждый разработчик фреймворка для сканирования должен реализовать свой собственный XPath, и Sipsoup не стал исключением. При разработке собственного фреймворка VScrawler автор столкнулся с необходимостью выбора инструмента для анализа HTML. В результате он остановился на Sipsoup, так как тот предоставляет гибкие возможности для реализации XPath запросов.
Однако при интеграции Sipsoup были выявлены некоторые недостатки, которые автор попытался исправить. В частности, он хотел добавить возможность проверки синтаксиса во время компиляции XPath-выражений и улучшить поддержку цепочечных запросов.
В результате Sipsoup стал более мощным инструментом для работы с XPath благодаря гибкому расширению и интеграции с Jsoup.
Основные изменения в Sipsoup:
Демонстрационные примеры включают форматирование текста всех узлов, использование позиции для выбора всех чётных узлов, регистрацию новых функций, регистрацию новых операторов и практическое применение 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, и будет обрабатывать преобразование типов в соответствии с общими правилами.
Следует отметить, что у оператора «+» есть две функции: если встречается число, выполняется сложение чисел, а если встречается строка, выполняется объединение строк. Если вы считаете, что это поведение не должно существовать, вы можете изменить его, переписав оператор.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )