当前位置: 首页 > 知识库问答 >
问题:

使用jsoup解析保留非HTML元素

孔鸿云
2023-03-14

我是jsoup的新手,在使用非HTML元素(脚本)时遇到了一些困难。我有以下HTML:

<$if not dcSnippet$>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="generator" content="Outside In HTML Converter version 8.4.0"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>

<$endif$>
<div style="position:relative">
<p style="text-align: left; font-family: times; font-size: 10pt; font-weight: normal; font-style: normal; text-decoration: none"><span style="font-weight: normal; font-style: normal">This is a test document.</span></p>
</div>
<$if not dcSnippet$>
</body>
</html>
<$endif$>

用于显示这一点的应用程序知道如何处理 和.语句。因此,当我简单地用jsoup解析文本时,<和>被编码,html被重新组织,所以它不能正确地执行或显示。例如:

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>&lt;$if not dcSnippet$&gt;
<meta http-equiv="generator" content="Outside In HTML Converter version 8.4.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
&lt;$endif$&gt;
<div style="position:relative">
<p style="text-align: left; font-family: times; font-size: 10pt; font-weight: normal; font-style: normal; text-decoration: none"><span style="font-weight: normal; font-style: normal">This is a test document.</span></p>
</div>
&lt;$if not dcSnippet$&gt;
&lt;$endif$&gt;
</body></html> 

我的最终目标是添加一些css和js包含,并修改几个元素属性。那真的不是问题,我已经解决了那么多了。问题是我不知道如何保留非HTML元素,并将格式与原始格式保持在同一位置。到目前为止我的解决方案是这样的:

  1. 读取HTML文件,然后遍历该文件,删除包含非HTML元素的行。
  2. 使用纯HTML创建文档对象
  3. 进行修改
  4. 返回HTML并重新插入我首先删除的非HTML元素(脚本)。
  5. 将文档保存到文件系统

只要非HTML的放置是可预测的,现在就可以这样做,到目前为止也是这样。但是我想知道是否有更好的方法来实现这一点,这样我就不必先‘清理’HTML然后手动重新引入我后来删除的内容。以下是我的代码要点(希望我没有错过太多声明):

String newLine();
FileReader fr = new FileReader(inputFile);
BufferedReader br = new BufferedReader(fr);
while ((thisLine = br.readLine()) != null) {
    if (thisLine.matches(".*<\\$if.*\\$>")) {
        ifStatement = thisLine + "\n";
    } else if (thisLine.matches(".*<\\$endif\\$>")) {
        endifStatement = thisLine + "\n";
    } else { 
        tempHtml += thisLine + "\n";
    }
}
br.close();

Document doc = Jsoup.parse(tempHtml, "UTF-8");
doc.outputSettings().prettyPrint(false).escapeMode(EscapeMode.extended);

Element head = doc.head();
Element body = doc.body();
Element firstDiv = body.select("div").first();

[... perform my element and attribute inserts ...]

body.prependText("\n" + endifStatement);
body.appendText("\n" + ifStatement);
String fullHtml = (ifStatement + doc.toString().replaceAll("\\&lt;", "<").replaceAll("\\&gt;", ">") + "\n" + endifStatement);

BufferedWriter htmlWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"));
htmlWriter.write(fullHtml);
htmlWriter.flush();
htmlWriter.close();

非常感谢任何帮助和投入!

共有1个答案

应俊爽
2023-03-14

问题是我不知道如何保留非HTML元素,并将格式与原始格式保持在同一位置。

Jsoup是一个HTML解析器。你给它的“HTML文件”不包含HTML。它更多地是一个用类似HTML的语言编写的模板文件。

结果,Jsoup充其量会将此模板文件视为无效的HTML文件。这就是为什么所有非HTML元素都被转义的原因。

为了获得所需的内容,您必须编写自定义模板解析器。Jsoup确实提供了一些泛型类,使这个任务变得非常容易。

但是,按照设计,这些通用类只保留给内部使用。

这给我们留下了四个选择:

  • 您的实际解决方案
    使用纯HTML提供Jsoup
  • 向Jsoup团队发送问题
    请求创建自定义解析器
  • 编写更健壮的自定义解析器
    这是一个重新发明的车轮解决方案IMO
  • 更改(如果可行)当前模板语言
    检查小胡子,例如胸腺叶
 类似资料:
  • 我想解析出这个Nasa页面上的描述,页面底部的文字 我该怎么做?

  • 主要内容:Jsoup 使用DOM解析HTML 语法,Jsoup 使用DOM解析HTML 说明,Jsoup 使用DOM解析HTML 示例以下示例将展示在将 HTML 字符串解析为 Document 对象后如何使用类似 DOM 的方法。 Jsoup 使用DOM解析HTML 语法 document : 文档对象代表 HTML DOM。 Jsoup : 解析给定 HTML 字符串的主类。 html : HTML 字符串。 sampleDiv : 元素对象表示由 id“sampleDiv”标识的 html

  • 问题内容: 这是我的HTML来源 这是我获取内容的Java程序,它过滤HTML标记 是否有使用Jsoup而不是使用Java而不是Regex解析HTML内容的简便方法 有没有办法只获取所需的内容。所以在这里我只需要内容“项目2-222” 问题答案: 尝试使用jsoup轻松解析: 要了解更多信息,请访问Jsoup Docs

  • 我试图从这个表中解析数据。例如,假设我想解析第二行中的第二个元素(称为SLO)。 我可以看到TR里面有一个TR,而SLO这个词甚至没有ID或任何东西。我如何解析这个? 这是代码: 我不知道在文档中放什么。选择(“”);因为我从未解析过这样的东西。我只解析过网页标题之类的东西。有人能帮我吗?

  • 我必须解析一些html并移除锚标记,但我需要保留锚标记的innerHTML 例如,如果我的html文本是: 现在我可以解析上面的html并在jsoup中选择如下所示的标记, 我可以通过, 但是它会从开始括号到结束括号删除完整的achor标记,并且内部html会丢失,如何才能保留只删除开始和结束标记的内部html。 另外,请注意:我知道有从元素中获取outerHTML()和innerHTML()的方

  • 问题内容: 我正在尝试使用jsoup解析HTML。这是我第一次使用jsoup,并且我也阅读了有关它的一些教程。以下是我要解析的HTML表- 如果您看到我的下表,则它现在有3个(我只是为了理解目的将其缩短为3个表行,但总的来说会更多)。现在,我想从我的下表中提取出它的对应信息,例如-我将提取其群集状态及其状态为关闭的所有主机名。 正如你可以看到下面的群集名称,我有两个主机名和其地位,但地位。 因此,