Для проблемы с номерами строк: Я предполагаю, что вам интересно, почему вы получаете столько строк, которые говорят "Тег найден в" - их больше, чем васожидается.Проблема в том, что эта строка эффективно загружает большую часть HTML-страницы в одну строку:
String content = tag.toPlainTextString();
Метод toPlainTextString()
включает текстовое содержимое дочерних тегов, поэтому все родительские теги тегасодержащие ***** собираются содержать также *****.Я думаю, что вы, вероятно, захотите использовать getText()
вместо этого, который не включает текст дочерних элементов (см. JavaDoc ).
Обратите внимание, что использование toPlainTextString()
, как это лучше избегатьпотому что это будет довольно медленно.Поскольку он вызывается для каждого тега в документе, возможно, вы заставляете документ читать его сто раз, без необходимости ...
Для проблемы с регулярным выражением: Вы на самом деле невызов метода split()
, который в данный момент содержит регулярное выражение.Но если бы вы были, я предполагаю, что это потерпит неудачу, потому что он пытается сопоставить как начальный тег, текстовый узел и конечный тег.Но HTML Parser дает вам только один узел за раз, то есть:
visitTag()
дает вам только начальный тег visitStringNode()
дает вам только текстовый узел visitEndTag()
дает вам только конечный тег
Таким образом, ваше регулярное выражение потерпит неудачу, потому что ожидает получить начало, текст и конец сразу.Кроме того, я думаю, что вам нужно избегать сопоставления звездочек следующим образом: [\*]+
Если вам нужно сопоставить что-либо по всем трем узлам, то вам нужно добавить некоторые частные переменные в ваш класс для записи состояния.то есть, если visitTag()
соответствует желаемому тегу, тогда установите логическое значение, говорящее о том, что текущий тег является действительным ... тогда, когда вызывается visitStringNode()
, он может проверить этот логический параметр, чтобы решить, обрабатывать ли текст или игнорировать его.Затем сбросьте логическое значение, когда вы встретите конечный тег.