Как получить правильный форматированный текст из 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();
}

Надеюсь, поможет.

Другие вопросы по тегам