这不重复。这是一个类似的question,但这些答案都没有能够处理真正的html文件。一个人可以保存任何HTML,即使是这个,并试图运行任何解决方案的答案......没有一个完全解决问题
问题是
我的桌面上有一个已保存的.htm
文件。我需要从中获取纯文本。但是我确实需要保留换行符,以便文本不在一行或几行上。
我尝试了here
中的以下所有方法 FileInputStream in = new FileInputStream("C:\\...myfile.htm");
String htmlText = IOUtils.toString(in);
for (String line : htmlText.split("\n")) {
String stripped = Jsoup.parse(line).text();
System.out.println(stripped);
}
这确实只保留了html文件的行。但是,文字仍然混乱,因为</br>
,<p>
等内容已被删除。如何解析以便文本保留所有自然换行符。
答案 0 :(得分:2)
这是我注意到jsoup与Selenium之间的区别,其中Selenium保留了换行符,而jsoup在提取文本时没有。话虽如此,我认为最好的方法是在您尝试提取文本的节点上获取innerHtml,然后在innerHtml上执行replaceAll以使用换行符替换</br>
和<p>
。
作为一个更完整的解决方案,而不是逐行读取文本文件,是否可以更原生地遍历html文本?您最好的选择是使用类似递归函数的方式遍历树,当您点击TextNode时,将该文本添加到示例中的剥离变量中。然后,当您点击<p>
或</br>
元素时,您可以根据需要添加换行符。
类似的东西:
Document doc = Jsoup.parse(htmlText);
然后在每个子节点的递归函数中传递它:
String getText(Element parentElement) {
String working = "";
for (Node child : parentElement.childNodes()) {
if (child instanceof TextNode) {
working += child.text();
}
if (child instanceof Element) {
Element childElement = (Element)child;
// do more of these for p or other tags you want a new line for
if (childElement.tag().getName().equalsIgnoreCase("br")) {
working += "\n";
}
working += getText(childElement);
}
}
return working;
}
然后你可以调用函数去除文本。
strippedText = getText(doc);
这不是最简单的解决方案,但如果你想从HTML中提取所有文本,那么我能想到的解决方案应该可行。我没有运行此代码,只是现在写了所以如果我错过了什么,我道歉。但它应该给你一般的想法。