Есть ли способ очистить недействительные атрибуты от HTML? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть потребность, когда я пытаюсь создать org.w3 c .dom.Document Объект из строки HTML, используя javax. xml .parsers.DocumentBuilder . Здесь есть возможность иметь недопустимые атрибуты и их значения в этой 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();  
        }
    }

В приведенном выше коде строка html с тегом LINK имеет недопустимый атрибут '\' и его значение '' '' (пустые двойные кавычки). Необходимо очистить этот html, который разбирает объект Document.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Вы не можете обрабатывать какие-либо данные, если не знаете, какие данные нужно обрабатывать. Это относится к вашей задаче, как и к любой другой. Если вы хотите обрабатывать грязные данные, вам нужно указать, с какой грязью вы ожидаете столкнуться и как вы предлагаете с ней бороться. Это определит принятый подход.

Может случиться так, что вид обработки, который вам нужно сделать, может быть выполнен существующей библиотекой, такой как TagSoup или validator.nu. Или, может быть, это можно сделать с помощью регулярных выражений. Без спецификации задачи мы не можем знать.

Рассмотрим пример. Предположим, что входной файл содержит "< < < < > > > >" Что бы вы хотели, чтобы ваша программа сделала с ним?

... ПОЗЖЕ

Из вашего комментария Звучит так, как будто HTML «правильно сформирован, но недействителен», если брать терминологию XML. Это означает, что вы могли бы рассмотреть решение 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 в качестве входных данных для процессора.

0 голосов
/ 20 марта 2020

Вы можете использовать

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

См. replaceAll страницу учебника для более подробной информации, особенно о escape-символах.

Эти вещи будут работать только с предопределенными символами, в Чтобы сделать вашу систему разумной и продолжать обновлять себя с каждым новым недопустимым символом, вам нужно написать метод для хранения таких новых символов в соответствующей структуре данных при обработке соответствующих исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...