【问题标题】:Java to Find Unclosed HTML TagsJava 查找未关闭的 HTML 标记
【发布时间】:2014-04-24 05:23:19
【问题描述】:

如何在 HTML 字符串中找到没有结束标签的标签并关闭它?

带有标签但没有结束标签的HTML字符串:

<html> 
    <head> </head> 
    <body> 
        <p style="margin-top: 0"> dasa </p> 
        <input size="1" type="text" value="a"> 
    </body> 
</html>

到

<html> 
    <head> </head> 
    <body> 
        <p style="margin-top: 0"> dasa </p> 
        <input size="1" type="text" value="a"> </input>
    </body> 
</html>

谢谢!

【问题讨论】:

标签: java html tags


【解决方案1】:

我有两个选项给你(我最喜欢第二个。)

1. http://home.ccil.org/~cowan/XML/tagsoup

 instead of parsing well-formed or valid XML, 
 parses HTML as it is found in the wild: 
 poor, nasty and brutish, though quite often far from short.
 TagSoup is designed for
 people who have to process this stuff using 
 some semblance of a rational application   
 design. By providing a SAX interface, 
 it allows standard XML tools to be applied to even the
 worst HTML. TagSoup also includes a command-line processor that reads
 HTML files and can generate either clean HTML or well-formed XML 
 that is a close approximation to XHTML.

这是我们正在使用的工具。我提到了另一个工具,但我没有使用它。

2。 http://htmlcleaner.sourceforge.net/download.php

只需下载 jar 文件并解压缩即可。并像下面那样运行 jar 文件。

  • 转到位置
  • java -jar htmlcleaner-2.8.jar src=http://google.com 它将纠正丢失的标签并给出输出。

例如 - 我有以下内容的 Html 文件

<table>
<tr>
<td>Wrong Table

它给出如下所示的输出

C:\Users\Lasitha Benaragama\Downloads\htmlcleaner-2.8>java -jar htmlcleaner-2.8.
jar src=http://localhost/fun/test.html
Apr 24, 2014 12:23:10 PM org.htmlcleaner.audit.HtmlModificationListenerLogger fi
reHtmlError
INFO: fireHtmlError:RequiredParentMissing(true) at tr
Apr 24, 2014 12:23:10 PM org.htmlcleaner.audit.HtmlModificationListenerLogger fi
reHtmlError
INFO: fireHtmlError:UnclosedTag(true) at table
Apr 24, 2014 12:23:10 PM org.htmlcleaner.audit.HtmlModificationListenerLogger fi
reHtmlError
INFO: fireHtmlError:UnclosedTag(true) at tbody
Apr 24, 2014 12:23:10 PM org.htmlcleaner.audit.HtmlModificationListenerLogger fi
reHtmlError
INFO: fireHtmlError:UnclosedTag(true) at tr
Apr 24, 2014 12:23:10 PM org.htmlcleaner.audit.HtmlModificationListenerLogger fi
reHtmlError
INFO: fireHtmlError:UnclosedTag(true) at td
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head />
<body><table>
<tbody><tr>
<td>Wrong Table</td></tr></tbody></table></body></html>

我也测试了你的 html, 输出是

C:\Users\Lasitha Benaragama\Downloads\htmlcleaner-2.8>java -jar htmlcleaner-2.8.
jar src=http://localhost/fun/test.html
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head />
<body>

        <p style="margin-top: 0"> dasa </p>
        <input size="1" type="text" value="a" />

</body></html>
C:\Users\Lasitha Benaragama\Downloads\htmlcleaner-2.8>

谢谢。

【讨论】:

    【解决方案2】:

    你可以保留一堆标签。当您遇到一个打开的标签时,将其推入堆栈。当你来到一个结束标签时,弹出并确保它与你所在的结束标签匹配。如果不是,那就是缺少标签。

    【讨论】:

      【解决方案3】:

      下面的代码非常适合我:

      import java.io.ByteArrayInputStream;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      
      import org.ccil.cowan.tagsoup.Parser;
      import org.dom4j.Document;
      import org.dom4j.DocumentException;
      import org.dom4j.io.SAXReader;
      import org.dom4j.io.XMLWriter;
      import org.xml.sax.SAXException;
      
      public class EmailUtil {
      
          public static String getValidHtml(String html) throws SAXException, DocumentException, IOException {
              ByteArrayOutputStream baos = null;
              SAXReader reader = new SAXReader(Parser.class.getName());
              Document doc = reader.read(new ByteArrayInputStream(html.getBytes()));
              baos = new ByteArrayOutputStream();
              XMLWriter writer;
              writer = new XMLWriter(baos);
              writer.write(doc);
              return baos == null ? null : baos.toString();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 2021-09-28
        • 1970-01-01
        • 2023-04-01
        • 2011-03-04
        相关资源
        最近更新 更多