Разбор HTML для получения текста для отдельных элементов с помощью Jsoup - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно разобрать текст ниже и создать отдельные объекты для каждого текста. Я попробовал несколько способов сделать это, но он не дает результаты в нужном мне формате.

Текст:

String text = "This is start of a text&nbsp;<a href=\"https://google.com/sample\">followed by a link&nbsp;sample</a>and ending with some text."

Используя следующий код:

Document document = Jsoup.parse(text);
Elements elements = document.select("*");
for(Element e : elements){
System.out.println( e.tagName() + ": " + e.text());}

Фактические результаты:

root: This is start of a text followed by a link sampleand ending with some text.
html: This is start of a text followed by a link sampleand ending with some text.
head: 
body: This is start of a text followed by a link sampleand ending with some text.
p: This is start of a text followed by a link sampleand ending with some text.
a: followed by a link sample

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

body: This is start of a text&nbsp;
a:followed by a link&nbsp;sample
body:and ending with some text.

1 Ответ

0 голосов
/ 28 октября 2019

Чтобы избежать возврата текста всех дочерних элементов, используйте e.ownText(), но этого недостаточно, так как вы хотите иметь отдельные This is start of a text и and ending with some text., но ownText() возвращает его объединенным: This is start of a text and ending with some text..
Чтобы получить список разделенных текстов, используйте e.textNodes(), и вывод для body будет:

body: [
This is start of a text&nbsp;, and ending with some text.]
a: [followed by a link&nbsp;sample]

, а дополнительным преимуществом является сохранение оригинала &nbsp;.
Также, если вы не используетеВам не нужны избыточные html: [] и head: [], добавленные в ваш документ, вы должны использовать синтаксический анализатор XML:

Document document = Jsoup.parse(text, "", Parser.xmlParser());

Чтобы разделить текст и <a> текст в порядке, попробуйте выполнить рекурсивную итерацию, используя: document.childNodes()а затем childNodes() для каждого узла. Вы можете идентифицировать текстовые узлы, проверив if (node instanceof TextNode).

...