在 Java 中将 HTML 转换为纯文本

2024-07-04

我需要将 HTML 转换为纯文本。我对格式的唯一要求是在纯文本中保留新行。新行不仅应在以下情况下显示<br>但其他标签,例如<tr/>, </p>也通向一条新线。

用于测试的示例 HTML 页面是:

  • http://www.article.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter09/scannerConsole.html http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter09/scannerConsole.html
  • http://www.javadb.com/write-to-file-using-bufferedwriter http://www.javadb.com/write-to-file-using-bufferedwriter

请注意,这些只是随机 URL。

我已经尝试过答案中提到的各种库(JSoup、Javax.swing、Apache utils)这个 StackOverflow 问题 http://stackoverflow.com/questions/240546/removing-html-from-a-java-string将 HTML 转换为纯文本。

使用 JSoup 的示例:

public class JSoupTest {

 @Test
 public void SimpleParse() {
  try {
   Document doc = Jsoup.connect("http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter09/scannerConsole.html").get();
   System.out.print(doc.text());

  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

HTMLEditorKit 示例:

import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class Html2Text extends HTMLEditorKit.ParserCallback {
 StringBuffer s;

 public Html2Text() {}

 public void parse(Reader in) throws IOException {
   s = new StringBuffer();
   ParserDelegator delegator = new ParserDelegator();
   // the third parameter is TRUE to ignore charset directive
   delegator.parse(in, this, Boolean.TRUE);
 }

 public void handleText(char[] text, int pos) {
   s.append(text);
 }

 public String getText() {
   return s.toString();
 }

 public static void main (String[] args) {
   try {
     // the HTML to convert
    URL  url = new URL("http://www.javadb.com/write-to-file-using-bufferedwriter");
    URLConnection conn = url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
    String inputLine;
    String finalContents = "";
    while ((inputLine = reader.readLine()) != null) {
     finalContents += "\n" + inputLine.replace("<br", "\n<br");
    }
    BufferedWriter writer = new BufferedWriter(new FileWriter("samples/testHtml.html"));
    writer.write(finalContents);
    writer.close();

     FileReader in = new FileReader("samples/testHtml.html");
     Html2Text parser = new Html2Text();
     parser.parse(in);
     in.close();
     System.out.println(parser.getText());
   }
   catch (Exception e) {
     e.printStackTrace();
   }
 }
}

让解析器将文本内容和换行符附加到 StringBuilder。

final StringBuilder sb = new StringBuilder();
HTMLEditorKit.ParserCallback parserCallback = new HTMLEditorKit.ParserCallback() {
    public boolean readyForNewline;

    @Override
    public void handleText(final char[] data, final int pos) {
        String s = new String(data);
        sb.append(s.trim());
        readyForNewline = true;
    }

    @Override
    public void handleStartTag(final HTML.Tag t, final MutableAttributeSet a, final int pos) {
        if (readyForNewline && (t == HTML.Tag.DIV || t == HTML.Tag.BR || t == HTML.Tag.P)) {
            sb.append("\n");
            readyForNewline = false;
        }
    }

    @Override
    public void handleSimpleTag(final HTML.Tag t, final MutableAttributeSet a, final int pos) {
        handleStartTag(t, a, pos);
    }
};
new ParserDelegator().parse(new StringReader(html), parserCallback, false);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中将 HTML 转换为纯文本 的相关文章

  • 我的标准差计算可以更加高效吗?

    我很好奇我的标准差方法是否可以变得更有效 我所说的高效是指快速 而快速是指从方法调用到方法返回的延迟 这是代码 public double stdDev ArrayList
  • UML 中的组合

    在 UML 图中考虑组合时 我们应该在逻辑或实现意义上使用它 这两个术语的示例 实施 机场将包含对国家 地区的引用 换句话说 一个国家是机场的一部分 逻辑 一个国家可以有零个或多个机场 换句话说 机场是国家的一部分 从上图中 哪种情况显示了
  • 从 Java 访问 Kotlin 类对象

    我有一个 Kotlin 类 它有一个类对象 例如 public class Foo public class object public val SomeValue Int 0 如果我从 Java 使用此类 如何访问类对象内的 SomeVa
  • 如何将 XML 文件直接写入 zip 存档?

    在不使用第 3 方库的情况下 使用 JAXB 直接将 XML 文件列表写入 zip 存档的正确方法是什么 将所有 XML 文件写入一个目录然后压缩会更好吗 正如其他人指出的那样 您可以使用ZipOutputStream类来创建 ZIP 文件
  • Spring Data REST - @PrePersist 和 @HandleBeforeCreate 之间的区别?

    I use Spring Data Rest over JPA映射 JPA提供 PrePersist在数据库中持久化实体之前要调用的方法的注释 Spring Data Rest 提供 HandleBeforeCreate捕获实体创建事件时调
  • 如何在javafx中嵌入PApplet?

    所以我让我的处理代码在java中运行 但现在我想将它嵌入到我的 GUI 的 JavaFX 中 我怎样才能这样做呢 我尝试使用以下代码 但它似乎不起作用 package testprocessing import javafx applica
  • 如何在 Spring Boot 中使用 CommonsMultipartResolver

    我尝试在 Boot 中使用 CommonsMultipartResolver 将我的旧应用程序 WAR 转换为 Boot 现在它得到以下代码 Configuration public class TestConfig Bean public
  • JOGL/OpenGL VBO - 如何渲染顶点?

    3我有以下SceneRenderer类 实现GLEventListener 我想我了解创建缓冲区 存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程 请参阅 init 方法 我奋斗的地方是展示 方法 我几乎尝试了在互联网上找到的所有内容
  • ClassLoader.getResourceAsStream 如何工作?

    我用 maven 创建了一个 jar 文件 当我打开这个罐子时 我可以找到以下内容 my jar text1 txt folder some other stuff 当我在 Eclipse 中运行此代码片段时 打印出 text1 txt 的
  • 新的 JUnit 4.8.1 @Category 渲染测试套件几乎已经过时了吗?

    给出的问题 如何运行属于某个类别的所有测试 和答案 https stackoverflow com questions 2176570 how to run all tests belonging to a certain category
  • Android onBackPressed() 没有被调用?

    在我的 MainActivity 从 AppCompatActivity 扩展 中 我想重写 onBackPressed 方法 如下所示 Override public void onBackPressed Log d MainActivi
  • 解压jar到指定目录

    我想使用以下命令将我的罐子之一提取到指定目录jar命令行实用程序 如果我理解正确的话 C选项应该能解决问题 但是当我尝试时 jar xvf myJar jar C directoryToExtractTo 我从 jar 实用程序获取使用信息
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include
  • 使用 Lucene 提取英语单词词干

    我正在 Java 应用程序中处理一些英文文本 我需要对它们进行词干处理 例如 从文本 amenities amenity 中我需要获取 amenit 该函数如下所示 String stemTerm String term 我找到了 Luce
  • GWT 的图表和绘图 API

    我正在尝试找到一个可以在 GWT 中使用 java 而不是 javascript 使用的图表和绘图 api 我遇到的唯一问题是我发现需要互联网连接的代码将无法连接到互联网 有谁知道这样的API吗 这是我找到的 但又无法使用 https co
  • 如何使用 xstream 将 Hashmap 映射到 XML 中的键值属性

    我有以下实体 XStreamAlias entity public class MapTestEntity XStreamAsAttribute public Map
  • CacheStoreMode USE 和 REFRESH 有什么区别

    javadoc 为缓存存储模式 http docs oracle com javaee 6 api javax persistence CacheStoreMode html区分我无法真正理解的一点 javadoc 为USE mode 从数
  • PHP 使用正则表达式分解字符串

    我有一个长字符串 由一系列用单引号分隔的句子组成 Example This s sentence number 1 This s sentence number 2 请注意 该字符串的句子本身有单引号部分 这些部分已被转义 我需要使用单引号
  • 如何在 eclipse 中安装最新版本的 Xuggler(5.4,截至 18/05/2013)?

    我真的不知道从哪里开始这样做 我已经从网站下载了必要的 Jar 并对如何在 Eclipse 中安装 Xuggler 进行了一些研究 但所有内容都已过时或不相关 我的系统是 64 位 Windows 8 大多数在 Vista 和 Window
  • 使用部署在 Tomcat 中的 Web 应用程序关闭 Tomcat

    我对我的 webapp 开发中遇到的 tomcat 操作有一些疑问 有什么办法可以从部署在tomcat中的web应用程序中关闭tomcat本身吗 tomcat 是否在一个 JVM 或单个 JVM 中运行其所有 webapps war 或者在

随机推荐

  • 将全局变量传递给函数有问题吗?

    考虑以下函数声明 int abmeld char strsend 这是这样称呼的 abmeld str where str是在程序文件开头 包含之后 声明和初始化的全局变量 如下所示 char str 300 现在我已经知道这是不必要的代码
  • 将 PHP 转换为数组并循环

    我正在为我们的空手道学校开发一个应用程序 希望从数据库中获取技术名称 将它们以随机顺序存储在一个数组中 并且能够单击一个按钮一次在整个数组中移动 我以几种不同的方式考虑过这个问题 包括从数据库中随机进行 这非常简单 但它多次提取相同的技术
  • Scala 防止混合的方法

    我想创造以下特征 trait IntSet A extends Traversable A self Product gt def foreach U f A gt U Unit case class AProduct a List Int
  • 使用 Matplotlib 创建箱线图

    我正在使用 python 3 和 jupyter 笔记本 我有一个 pandas 数据框 其结构如下 location price Apr 25 ASHEVILLE 15 0 Apr 25 ASHEVILLE 45 0 Apr 25 ASH
  • 时钟()精度

    我看过很多关于使用clock 函数来确定程序中经过的时间量的帖子 代码如下 start time clock code to be timed end time clock elapsed time end time start time
  • 如何在 jasmine 中模拟 $scope.variables

    我有以下测试用例 CompanyCtrlSpec js describe ViewCompanyCtrl function var rootScope scope controller q beforeEach angular mock m
  • jquery 解决方案从静态 html 页面发布到另一个站点

    需要将数据从静态 html 页面发布到托管在另一个域上的另一个页面 通常 我会使用 post 方法创建一个包含表单的 iframe 其操作定向到该网页 最后提交该表单 复杂之处在于我要从静态 html 页面收集数据并在 iframe 内创建
  • 将 3 个具有透明度的图像组合在一起

    我正在做这个项目 我想将三张图像合并为一张 到目前为止 有效的方法是使每个图像 jpg 透明 但将它们合并成新的 png 图像后 透明度就消失了 这是代码 function CreateMyCoolOutfitBaby Outfitwidt
  • 从 try catch finally 块中返回是不好的做法吗?

    所以今天早上我遇到了一些代码 如下所示 try x SomeThingDangerous return x catch Exception ex throw new DangerousException ex finally CleanUp
  • php curl 获取 html 和 js 渲染

    php curl 只获取html页面的源代码 不执行js脚本 我需要我的网站获取已执行所有 JavaScript 的源代码 我使用ajax 但无法在页面中添加更多js 因为当我加载另一个页面时脚本会保留 我找到了 SpiderMonkey
  • SQLCMD :r 其中路径是变量

    SQLCMD命令是否执行 r支持非常量文字路径吗 例如 setvar path1 script sql r path1 SQL01260 A fatal parser error occurred r path1 SQL01260 A fa
  • 是否可以在所有平台上确定性地从 jpeg 文件中读取像素?

    我遇到一个问题 我发现 JPEG 图像中的像素可能会略有不同 具体取决于我用来读取它们的计算机 我主要是一名Python程序员 我更喜欢使用opencv来读取我的图像 但我不反对使用PIL做一些事情或用C读取图像 根据这篇文章JPEG 图像
  • 使用 jQuery 和 Bootstrap 可重复使用的下拉菜单

    我正在尝试使用最新的 jQuery 3 6 1 和 Bootstrap 5 2 3 构建可重用的下拉菜单 但事实证明这很困难 我需要使用单击的按钮上指定的数据属性的值动态更新下拉列表的链接 我正在看优秀的solution https sta
  • OpenMP 运行线程但继续 main

    我正在尝试使用 OpenMP 进行线程处理 因为它是跨平台的 但是我不知道如何使并行后的代码在循环运行时继续运行 它基本上只是并行执行第一个循环 但永远不会执行第二个非并行循环 int main pragma omp parallel wh
  • do.call(rbind, ...) 是否有更高阶的替代品?

    考虑以下数据框A A lt data frame ID c 1 1 1 2 2 2 num c 6 2 8 3 3 1 With A 我想分开ID 然后计算差值num 可以 几乎 获得所需的结果 do call rbind Map func
  • PHP 警告:模块“mcrypt”已加载

    当我使用 PHP 运行命令时 它显示一个错误 例如当我跑步时php v查看我的 PHP 版本 它显示一个错误 然后显示有关 PHP 的信息 模块 mcrypt 已加载到第 0 行的 未知 中 zied ubuntu php v PHP Wa
  • 无法更新firebase版本[重复]

    这个问题在这里已经有答案了 C Users Kashish gt npm install g firebase tools npm WARN optional SKIPPING OPTIONAL DEPENDENCY timed out 4
  • cockplot:调用plot_grid后提取子图

    我在用plot grid安排两个图 library ggplot2 library cowplot d data frame x rnorm 100 y rnorm 100 g sample c a b 100 replace T p1 g
  • 使用两列的 T-SQL“不在其中”

    我想从表 T1 中选择所有记录 其中 A 列和 B 列中的值与表 T2 中的 C 列和 D 列没有匹配的元组 In mysql Where not in 使用两列 https stackoverflow com questions 8435
  • 在 Java 中将 HTML 转换为纯文本

    我需要将 HTML 转换为纯文本 我对格式的唯一要求是在纯文本中保留新行 新行不仅应在以下情况下显示 br 但其他标签 例如 tr tr 也通向一条新线 用于测试的示例 HTML 页面是 http www article kth se li