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

如何防止Jsoup在解析文本时擦除文本中的尖括号

解鸿运
2023-03-14

我试图只解析包含尖括号作为文本一部分的html文档的文本。

例如,html文件看起来如下所示:

<html>
 <head></head> 
 <body> 
  <div>
    <p>1. <someUnicodeString></p> 
    <p>2. <foo 2012.12.26.></p> 
    <p>3. <123 2012.12.26.></p> 
    <p>4. <@ 2012.12.26.></p> 
    <p>5. foobarbar</p> 
  </div>
 </body>
</html>

我希望解析的文本文件的结果如下所示:

1. <someUnicodeString> 
2. <foo 2012.12.26.> 
3. <123 2012.12.26.> 
4. <@ 2012.12.26.> 
5. foobarbar

我使用JSOUP的解析函数来实现这一点,如下所示,

Document doc = null;

try {
    doc = Jsoup.parse(new File(path), "UTF-8");
    doc.outputSettings(new Document.OutputSettings().prettyPrint(false));
    doc.outputSettings().escapeMode(EscapeMode.xhtml);

    //set line breaks in readable format
    doc.select("br").append("\\n");
    doc.select("p").prepend("\\n\\n");
    String bodyText = doc.body().html().replaceAll("\\\\n", "\n");
    bodyText = Jsoup.clean(bodyText, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));

    File f = new File(textFileName+".txt");
    f.getParentFile().mkdirs();
    PrintWriter writer = new PrintWriter(f, "UTF-8");
    writer.print(Parser.unescapeEntities(bodyText, false));
    writer.close();
} catch(IOException e) {
    //Do something
    e.printStackTrace();
}

但是,一旦Jsoup完成解析过程,它就会为每个尖括号添加标记,后面跟字符。

<p>1. <someUnicodeString></someUnicodeString></p> 
<p>2. <foo 2012.12.26.></foo></p> 
<p>3. <123 2012.12.26.></p> 
<p>4. <@ 2012.12.26.></p> 
<p>5. foobarbar</p> 

最终产生结果

1.  
2.  
3. <123 2012.12.26.> 
4. <@ 2012.12.26.> 
5. asdasd 

如何防止Jsoup在解析文本时擦除文本中的尖括号?

或者是否有一种方法使Jsoup识别某些尖括号不是html元素?(可能使用正则表达式?)

我是新加入Jsoup的,非常感谢任何形式的帮助。谢谢.

共有1个答案

屈浩波
2023-03-14

感谢Davide Pastore的评论,以及“HTML中的右尖括号”问题

我能够用下面的代码解决这个问题。

doc = Jsoup.parse(new File(path), "UTF-8");
//replace all left-angle tags inside <p> element to "&lt;"
Elements pTags = doc.select("p");
for (Element tag : pTags) {
    //change the boundary of the regex to whatever suits you
    if (tag.html().matches("(.*)<[a-z](.*)")) {
        String innerHTML = tag.html().replaceAll("<(?=[a-z])", "&lt;");
        tag.html(innerHTML);
    }
}

如果您在开始解析之前完成将文本中的“<”转换为<的过程,您将能够获得正确的输出。

 类似资料:
  • 问题内容: 我有要在Python中删除的文本文件。我怎么做? 问题答案: 在python中: 或者,如果您已经打开了文件: 在C ++中,您可以使用类似的东西。

  • 问题内容: 在大多数情况下,使用jsoup解析XML都没有问题。但是,如果有XML文档中的标签,jsoup将改变到。这样就无法使用CSS选择器提取标签内的文本。 那么如何防止jsoup“清除” 标签呢? 问题答案: 在jsoup 1.6.2中, 我添加了XML解析器模式,该模式可以按原样解析输入,而无需应用HTML5解析规则(元素内容,文档结构等)。此模式将文本保留在标签中,并允许其倍数等。 这是

  • 我试图用Jsoup解析Javadocs,但提取标记中包装的文本时遇到问题。 下面是我试图解析的HTML示例: 我试图使用这段代码来解析标签中包含的文本: 然而,无论我尝试什么,包含在标签中的文本都会消失。 以下是我得到的输出示例: 这就像是JSoup只是把任何包裹在标签中的东西丢弃。有人知道如何保留这些标签并从中提取文本吗?

  • 问题内容: 如果你这样做 然后,当您看着时,您就会得到。(很公平。) 如果这样做,您会得到。 基本上,我正在寻找一种将其转换为string的方法。 显然,在现实生活中,我无法控制JSON输入,而是从Web服务获取JSON …我想使用浏览器的JSON解析器解析JSON,并能够识别数字值和。 除了手动读取JSON字符串外,还有什么方法可以做到这一点?在这种情况下,这实际上是不可能的,为了提高速度,我需

  • 我正在写一个小程序,可以处理大的(最多无限个)文本文件。处理过程将相当简单(将部分内容修剪并处理成单独的字符串,然后打印出来)。然而,由于数据的长度可能是无限的,我可能会遇到超过堆的问题。我想到的第一个解决方案是使用流来处理数据。然而,Files类中的lines()方法只能将文本分成行。我的线条也可以无限长! 我遇到的另一个解决方案是使用scanner useDelimiter方法: 这种方法会阻

  • 问题内容: 我有 JTextField 显示文件名。如果文件无效,我想 删除 文本。怎么办呢?我尝试了html,但没有运气。 问题答案: 我敢肯定,除了设置字体外,您无法在中设置文本的样式。我认为您要么必须创建自己的支持样式的子类,要么创建一个并将其设置为类似的行为。 这里有一些很好的文档:http : //download.oracle.com/javase/tutorial/uiswing/c