2015-05-07 2 views
1

Как видно на скриншоте, jsoup вставляет пустой TextNode до/после каждого другого дочернего узла. Есть ли способ отключить это? Или я делаю что-то неправильно? Есть ли какая-то причина, почему они существуют?Jsoup inserts empty TextNodes

Jsoup 1.8.2 если это помогает.

Example

+1

ли это на самом деле вызывают никаких проблемы? Я предполагаю, что текстовые узлы не пусты, но они содержат пробелы и разрывы строк между фактическими элементами. – JonasCz

+0

Да, я об этом не думал. Фактически они могут содержать их. Что касается проблем - они вызывают их из-за того, что childnodes(). Size() больше не возвращает правильные данные, и я также не могу просто проследить их вслепую, так как мне нужно проверить, является ли элемент фактическим или просто «пустым» TextNode , – NekoiNemo

+0

Возможно, вы могли бы записать ошибку. Не должно быть слишком сложно прокручивать их и игнорировать пустые. – JonasCz

ответ

1

Есть ли способ, чтобы превратить это прочь?

Нет, так как это нормальное поведение Jsoup HTML-парсера.

Или я делаю что-то не так?

Метод, вызываемый, возможно, является основной причиной всей проблемы.

Есть ли какие-либо причины, по которым они существуют?

Каждый раз, когда текст найден в HTML-документе, он представлен в виде TextNode в окончательном HTML дереве объектов (Document).

Если автор HTML-документа помещает разрыв строки перед элементом, Jsoup создаст TextNode для этого разрыва строки.

(...) ChildNodes(). Размер() больше не возвращает правильные данные

Я думаю, что суть проблемы здесь. Вместо вызова Node#childnodes() вызовите метод Element#children(). Этот метод будет отфильтровывать пустые TextNode s для вас.

В качестве альтернативы, вы можете использовать следующий фрагмент код, чтобы получить данные:

Document doc = ... 
Elements tds = doc.select("table tr > td"); 
if (tds.size() == 0) { 
    // No td found ... 
} 

// ... 

Jsoup 1.8.2