Nano Hash - криптовалюты, майнинг, программирование

Обнаружение фрагмента HTML jsoup

Я разбираю фрагмент html, не зная, что это фрагмент. Я использую HTML-парсер jsoup. Например:

    String html = "<script>document.location = \"http://example.com/\";</script>";
    Document document = Jsoup.parse(html);
    System.out.println(document.html());

Вывод:

<html>
   <head>
     <script>document.location = "http://example.com/";</script>
   </head>
  <body></body>
</html>

Вопрос: Есть ли способ узнать, что теги <html>, <head> и <body> были добавлены Jsoup, а не в исходном html-фрагменте?

Обновлять:

Я также попытался включить отслеживание ошибок:

Parser parser = Parser.htmlParser();
parser.setTrackErrors(500);
Document document = parser.parseInput(html, "example.com");
ParseErrorList errors = parser.getErrors();

Но я получаю пустой список ошибок.


Ответы:


1

Самый простой способ сделать это — разобрать его и как XML, и как HTML, и сравнить количество элементов в обоих результатах. анализатор XML не добавляет элементы автоматически, тогда как анализатор HTML автоматически добавляет отсутствующие необязательные теги и выполняет другую нормализацию.

Вот пример:

@Test public void detectAutoElements() {
    String bare = "<script>One</script>";
    String full =
       "<html><head><title>Check</title></head><body><p>One</p></body></html>";

    assertTrue(didAddElements(bare));
    assertFalse(didAddElements(full));
}

private boolean didAddElements(String input) {
    // two passes, one as XML and one as HTML. XML does not vivify missing/optional tags
    Document html = Jsoup.parse(input);
    Document xml = Jsoup.parse(input, "", Parser.xmlParser());

    int htmlElementCount = html.getAllElements().size();
    int xmlElementCount = xml.getAllElements().size();
    boolean added = htmlElementCount > xmlElementCount;

    System.out.printf(
      "Original input has %s elements; HTML doc has %s. Is a fragment? %s\n",
      xmlElementCount, htmlElementCount, added);

    return added;
}

Это дает результат:

Original input has 2 elements; HTML doc has 5. Is a fragment? true
Original input has 6 elements; HTML doc has 6. Is a fragment? false

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

07.01.2021
  • Это не работает для меня. ошибки.размер() равен 0 07.01.2021
  • Да, извините, отсутствующие необязательные теги не считаются ошибкой синтаксического анализатора. Я обновил свой ответ, чтобы использовать другой подход к сравнению XML с построением дерева HTML, который действительно работает. Возможно, стоит подумать о добавлении программных ошибок для необязательных тегов, поскольку я думаю, что это может быть полезно для отслеживания. 08.01.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..