繁体   English   中英

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

[英]How to keep line breaks when using Jsoup.parse?

这不是重复的。 这是一个类似的问题 ,但这些答案都没有能够处理真正的html文件。 一个人可以保存任何HTML,即使是这个,并尝试运行任何解决方案的答案...他们都没有完全解决问题


问题是

我的桌面上有一个已保存的.htm文件。 我需要从中获取纯文本。 但是我确实需要保留换行符,以便文本不在一行或几行上。

我从这里尝试了以下和所有方法

        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中提取所有文本,那么我能想到的解决方案应该可行。 我没有运行此代码,只是现在写了所以如果我错过了什么,我道歉。 但它应该给你一般的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM