有没有办法从 HTML 中清除无效属性?

Posted

技术标签:

【中文标题】有没有办法从 HTML 中清除无效属性?【英文标题】:Is there a way to cleanup invalid attributes from HTML? 【发布时间】:2020-07-01 07:57:15 【问题描述】:

我需要使用 javax.xml.parsers.DocumentBuilderhtml 字符串创建 org.w3c.dom.Document 对象。这里有可能在该 HTML 字符串中包含无效属性及其值。那么有什么方法或 Java 工具可以只清除 HTML 中的无效属性吗?尝试了 JSOUP 清理,因为它的清理基于白名单标签和属性。但我需要只清理无效属性(根据 HTML5 标准)。

public static void main(String[] args) throws NotebookException 

        String text = "<div dir=\"ltr\"><link href=\"http://fonts.googleapis.com/css?family=Open+Sans:light:bold\" rel=\"stylesheet\" \\=\"\">";

        try(ByteArrayInputStream bais=new ByteArrayInputStream(text.getBytes()))
               
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(new InputSource(bais));
        
        catch (Exception e) 
        
            e.printStackTrace();  
        
    

在上面的代码中,带有 LINK 标记的 html 字符串具有无效的属性 '\' 及其值 '""'(空双引号)。需要清理这个解析为 Document 对象的 html。

【问题讨论】:

【参考方案1】:

你可以使用

String.replaceAll("[unwanted chars]","");

请参阅replaceAll tutorial page 了解更多详细信息,尤其是转义字符。

这些东西只适用于预定义的符号,为了使您的系统智能并不断更新自己遇到的每个新的无效符号,您需要编写一个方法来将这些新符号存储在适当的数据结构中,同时处理相关例外。

【讨论】:

【参考方案2】:

除非您知道需要处理哪些数据,否则您无法处理任何数据。这适用于您的任务,就像适用于任何其他任务一样。如果你想处理脏数据,你需要指定你期望遇到什么样的脏数据以及你打算如何处理它。这将决定采用的方法。

您需要做的那种处理可能可以通过现有的库来完成,例如 TagSoup 或 validator.nu。或者它可能是可以使用正则表达式来完成的。没有任务说明,我们无法知道。

考虑一个例子。假设输入文件包含"&lt; &lt; &lt; &lt; &gt; &gt; &gt; &gt;" 你希望你的程序用它做什么?

...稍后

从您的评论来看,借用 XML 术语,听起来好像 HTML 是“格式正确但无效”。这意味着您可以考虑使用 XSLT 解决方案:

<xsl:apply-templates select="saxon:parse-html('input.bad.html')"/>

...

<xsl:template match="a/@href | */@class | */@id | .... (:all valid attributes:)">
   <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="@* (: attributes not in the above list :)">
  <!-- no action (drop the attribute) -->
</xsl:template>

saxon:parse-html() 是 Saxon XSLT 扩展。对于其他处理器,可能还有其他方法可以将 HTML 解析为 XML DOM,并将 XML DOM 用作处理器的输入。

【讨论】:

我希望我的代码检查标签是否是 HTML4/HTML5 允许的标签,如果是则检查属性并删除该标签不支持的属性。

以上是关于有没有办法从 HTML 中清除无效属性?的主要内容,如果未能解决你的问题,请参考以下文章

1.7 (git相关) .gitignore 添加后无效的解决办法

css中有没有办法清除所有字体系列+字体大小样式声明?

无效后从内存中清除图像资源

有没有办法清除已经从Android设备手动捕获的位置详细信息?

Symfony 部署后清除缓存组件

有没有办法清除使用 source < (grep = ...) 读取的变量?