java - 使用 Jsoup.parse 时如何保持换行?

标签 java jsoup

这不是重复的。是一个类似的 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>被删除了。我如何解析以便文本保留所有自然换行符。

最佳答案

这是我注意到 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 中提取所有文本,我认为应该可行。我还没有运行这段代码,只是现在才写,所以如果我错过了什么,我深表歉意。但它应该能让您大致了解。

关于java - 使用 Jsoup.parse 时如何保持换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20075991/

相关文章:

java - Java 的 printf() 是一种不好的做法吗?

java - 将连续显示的 JPanels Swing 到右上角

java - JSOUP 解析 XYZ.tor2web.org

grails - 在Groovy中使用JSoup获取mp3/pdf文件

java - 使用正则表达式从 HTML 属性中提取数字

java - 查找具有预先计算值的表是 O(1) 算法吗?

java - 如何从 Java 运行 Mac 应用程序?

Java:Object 类有构造函数吗?

java - 使用 jSoup 或其他库执行 JavaScript 后解析 HTML DOM

java - 如何使用类名从网站中提取脚本特定脚本文件