Как получить правильный форматированный текст из HTML, когда теги не имеют разрывов строк
Я пытаюсь проанализировать этот образец HTML-файла с помощью библиотеки Jsoup HTML-разбора.
<html>
<body>
<p> this is sample text</p>
<h1>this is heading sample</h1>
<select name="car" size="1">
<option value="Ford">Ford</option><option value="Chevy">Chevy</option><option selected value="Subaru">Subaru</option>
</select>
<p>this is second sample text</p>
</body>
</html>
И я получаю следующее, когда я извлекаю только текст.
this is sample text this is heading sample FordChevySubaru this is second sample text
В тексте тега опции нет пробелов или разрывов строк.
Тогда как если бы HTML был таким
<html>
<body>
<p> this is sample text</p>
<h1>this is heading sample</h1>
<select name="car" size="1">
<option value="Ford">Ford</option>
<option value="Chevy">Chevy</option>
<option selected value="Subaru">Subaru</option>
</select>
<p>this is second sample text</p>
</body>
</html>
Теперь в этом случае текст выглядит так
this is sample text this is heading sample Ford Chevy Subaru this is second sample text
с правильными пробелами в тексте опции tag. Как получить второй вывод с первым HTML-файлом. т.е. если в тегах нет разрыва строки, как это возможно, что строка не будет объединена.
Я использую следующий код в Java.
public static String extractText(File file) throws IOException {
Document document = Jsoup.parse(file,null);
Element body=document.body();
String textOnly=body.text();
return textOnly;
}
1 ответ
Решение
Я думаю, что единственное решение, которое отвечает вашим требованиям, - это обход DOM и печать текстовых узлов:
public static String extractText(File file) throws IOException {
StringBuilder sb = new StringBuilder();
Document document = Jsoup.parse(file, null);
Elements body = document.getAllElements();
for (Element e : body) {
for (TextNode t : e.textNodes()) {
String s = t.text();
if (StringUtils.isNotBlank(s))
sb.append(t.text()).append(" ");
}
}
return sb.toString();
}
Надеюсь, поможет.