JsoupXpath
JsoupXPath — это анализатор HTML, основанный на Jsoup и Antlr4. Возможно, это лучший вариант на Java, просто попробуйте его.
JsoupXpath — это парсер, полностью разработанный на Java с использованием Xpath для анализа и извлечения данных HTML. Он полностью реализует синтаксис стандарта W3C XPATH 1.0 для парсинга HTML. Лексер и парсер Xpath построены на основе Antlr4, а генерация DOM-дерева HTML использует Jsoup, поэтому он называется JsoupXpath. JsoupXpath был разработан в условиях, когда мы не смогли найти достаточно хороший парсер Xpath, но также хотели воспользоваться мощными возможностями и удобством использования Xpath в Java. Логика реализации JsoupXpath ясна и легко расширяема, она поддерживает полный синтаксис стандарта W3C XPATH 1.0. W3C спецификации: http://www.w3.org/TR/1999/REC-xpath-19991116, Синтаксический файл описания JsoupXpath: Xpath.g4
https://github.com/zhegexiaohuozi/JsoupXpath/releases
Любые вопросы или предложения можно обсудить, отправив электронное письмо по следующему списку рассылки. Перед первым выступлением необходимо подписаться и дождаться одобрения. (в основном используется для блокировки рекламы и т. д.)
— Подписка: пожалуйста, напишите на seimicrawler+subscribe@googlegroups.com — Выступление: пожалуйста, отправьте письмо на seimicrawler@googlegroups.com — Отписка: пожалуйста, напишите на seimicrawler+unsubscribe@googlegroups.com
Зависимости Maven, пожалуйста, обратитесь к информации о выпуске или центральному репозиторию Maven для полной версии:
<dependency>
<groupId>cn.wanghaomiao</groupId>
<artifactId>JsoupXpath</artifactId>
<version>${latest-version-in-maven}</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
(https://github.com/zhegexiaohuozi/JsoupXpath/blob/master/src/test/java/org/seimicrawler/xpath/JXDocumentTest.java), здесь есть много тестовых случаев.
Или более типичный пример в Issue.
Поддерживает полный стандартный синтаксис W3C XPATH 1.0. Спецификации W3C: http://www.w3.org/TR/1999/REC-xpath-19991116
//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. Эти браузеры всегда автоматически дополняют некоторые теги в соответствии со стандартом при рендеринге страницы. Например, тег таблицы автоматически добавляется тегом tbody, очевидно, что сгенерированный путь Xpath не является наиболее универсальным, и поэтому значение, скорее всего, не может быть взято. Поэтому, чтобы использовать Xpath и почувствовать удобство и элегантность, которые он приносит, лучше всего изучить стандарт. Синтаксис Xpath, чтобы вы могли легко решать все виды проблем и наслаждаться истинной мощью 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)
функция суммы возвращает сумму для каждого узла в аргументе node-set результата преобразования строковых значений узла в число.
boolean starts-with(string, string)
определяет, начинается ли первая строка со второй.
int string-length(string?)
возвращает длину строки, если дана строка, иначе преобразует текущий узел в строку и возвращает длину.
string substring(string, number, number?)
Первый параметр указывает строку, второй — начальную позицию (индексы xpath начинаются с 1), а третий — длину, которую нужно усечь. Здесь мы должны обратить внимание на синтаксис xpath, это не конечная позиция.
substring("12345", 1.5, 2.6)
возвращает «234».
substring("12345", 2, 3)
возвращает «234».
string substring-ex(string, number, number)
Первый параметр указывает строку, второй — начальную позицию (используются индексы java, начинающиеся с 0), а третий — конечную позицию (поддерживаются отрицательные числа). Это расширенные функции JsoupXpath, удобные для разработчиков, привыкших к java.
string substring-after(string, string)
усекает часть после второй строки в первой строке.
string substring-before(string, string)
усекает часть перед позицией последнего вхождения второй строки в первую строку.
Вышеупомянутые функции являются лишь стандартными функциями в Xpath 1.0. Разработчики также могут быстро и легко добавлять пользовательские функции, просто нужно реализовать интерфейс org.seimicrawler.xpath.core.Function.java и вызвать Scanner.registerFunction (Class <? Extends Function> func), когда ваша система инициализируется. Нет необходимости изменять парадигму синтаксиса, поскольку JsoupXpath может распознавать и загружать во время выполнения. Вы можете отправить запрос на извлечение в основной репозиторий о функциях в стандартном синтаксисе, которые ещё не реализованы JsoupXpath.
allText()
извлекает весь текст под узлом, вместо использования рекурсивного текста, такого как // div / h3 // text ().
html()
получает внутренний html всех узлов.
outerHtml()
получает весь html всех узлов, включая сам узел.
num()
извлекает все числа в собственном тексте узла. Если вы знаете, что в собственном тексте узла есть только одно число (текст, содержащийся в дочерних узлах), например, количество прочтений, количество комментариев и цена, вы можете напрямую извлечь его. Если есть несколько чисел, будет извлечено первое совпадающее последовательное число.
text()
извлекает собственный текст узла.
node()
извлекает все узлы.
AxisName: 'ancestor' // Select from the ancestors of the node in the current context
| 'ancestor-or-self' // Select from the ancestors of the node and the node itself in the current context
| 'attribute' // Operations for extracting node attributes
| 'child' // Select from the child nodes of the node in the current context. This is the default axis of xpath. For example, /div/li is the shorthand of /div/child::li
| 'descendant' // Select from the descendants of the node in the current context
| 'descendant-or-self' // Select from the descendants of the node and the node itself in the current context
| 'following' // Select from all nodes behind the node in the current context
| 'following-sibling' //
``` | Оператор | Значение |
| --- | --- |
| *Select from all sibling nodes behind the node in the current context* |
| parent ' // Select from the parent of the node in the current context | Выбрать из родительского узла текущего контекста |
| 'preceding' // Select from all nodes before the node in the current context | Выбрать все узлы перед текущим узлом |
| 'preceding-sibling' // Select from all sibling nodes before the node in the current context | Выбрать всех предшествующих братьев и сестёр текущего узла |
| 'self' // Select in current context | Выбрать текущий узел |
| 'following-sibling-one' // Select from the following sibling node of the node in the context (JsoupXpath expansion) | Выбрать следующего брата или сестру текущего узла (расширение JsoupXpath) |
| 'preceding-sibling-one' // Select the preceding sibling node of the node in the context (JsoupXpath extension) | Выбрать предыдущего брата или сестру текущего узла (расширение JsoupXpath) |
| 'sibling' // All siblings (JsoupXpath extension) (under development ...) | Все братья и сёстры (расширение JsoupXpath, в разработке...) |
| ; | |
### Operator ###
MINUS
: '-';
PLUS
: '+';
DOT
: '.';
MUL
: '';
DIVISION
: 'div
';
MODULO
: 'mod
';
DOTDOT
: '..';
AT
: '@';
COMMA
: ',';
PIPE
: '|';
LESS
: '<';
MORE_
: '>';
LE
: '<=';
GE
: '>=';
START_WITH
: '^='; // a^=b
a startwith b (JsoupXpath extension)
END_WITH
: '$='; // a*=b
a contains b (JsoupXpath extension)
CONTAIN_WITH
: '='; // a contains b (JsoupXpath extension)
REGEXP_WITH
: '='; // the content of a matches the regular expression b (JsoupXpath extension)
REGEXP_NOT_WITH
: '!'; // the content of a does not match the regular expression b (JsoupXpath extension)
Currently, JsoupXpath is widely used in projects or organizations such as SeimiCrawler. If you also have a project using JsoupXpath and want to appear in this list, you can contact me through the following contact details, the mail format can be:
Project or organization name: XX
Project or organization URL: http://xxx.xxx.cc
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )