Синтаксический анализ html-документа с помощью XML-анализатора

могу ли я проанализировать HTML-файл с помощью синтаксического анализатора XML?

Почему я не могу ('t) это сделать. Я знаю, что XML используется для хранения данных и что HTML используется для отображения данных. Но синтаксически они почти идентичны.

предполагаемое использование заключается в создании парсера HTML, который является частью приложения веб-искателя

3 ответов


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

  • элементов никогда не имеют конечных тегов и это не использует так называемый "самозакрывающийся синтаксис тегов XML"; например, <br>, <meta>, <link> и <img> (также известный как пустота elements)
  • элементов не требует закрывающего тега, например, <p> <dt> <li> (их конечные теги можно подразумевается)
  • элементы, которые могут содержать разметка без эскапады "<" символы; например, стиль, textarea, заголовок, скрипт; <script> if (a < b) … </script>, <title>Using the "<" operator</title>
  • атрибуты без кавычек значений; например, <metacharset=utf-8>
  • атрибуты пустой, без отдельного значения, данного вообще; например,<inputdisabled>

синтаксический анализатор XML не сможет проанализировать любой HTML-документ, который использует любую из этих функций.

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


все, что было сказано, также была проделана работа по разработке нового типа синтаксического анализа XML-так называемый XML5 парсинга - способен обрабатывать такие вещи, как пустые/неквотируемые атрибуты атрибутов даже в XML-документах. Есть проект спецификации XML5, а также как парсер XML5, xml5ever.


назначение-сделать парсер HTML, который является частью веб гусеничный ход применение

если вы собираетесь создать веб-приложение-искатель, вы должны абсолютно использовать парсер HTML-и в идеале, парсер HTML, который соответствует разбор требований в стандарте HTML.

в наши дни существуют такие соответствующие Парсеры HTML для многих (или даже большинства) языков; например:



синтаксически они почти идентичны

компьютеры разборчивы. "Почти идентично"недостаточно. HTML позволяет то, что XML не делает, поэтому синтаксический анализатор XML отклонит (многие, хотя и не все) HTML-документы.

кроме того, существует другая культура качества. С HTML культура для парсера - "попробуйте что-то сделать с вводом, если это возможно". С XML культура "если она неисправна, отправьте ее обратно для ремонта или замена."


синтаксические анализаторы XML остановятся, как только содержимое XML не будет хорошо сформировано.
Некоторые правила XML не применяются к HTML (например, незаконные символы), поэтому любой синтаксический анализатор XML будет считать ваш HTML недостаточно хорошо сформированным и не будет продолжать.

рассмотрим следующий HTML "страница":

<!doctype html>
<html>
  <head><title>Test</title></head>
  <body>
    <input type="checkbox" name="azerty" checked />
    <p>if A=B & B>D, then A>D</p>
  </body>
</html>

это отлично сформированный и действительный HTML, так как вы можете проверить валидатор W3C (validator.w3.org).

теперь просто попробуйте проверить следующий XML (on http://www.xmlvalidation.com например):

<?xml version="1.0"?>
<html>
  <head><title>Test</title></head>
  <body>
    <input type="checkbox" name="azerty" checked />
    <p>if A=B & B>D, then A>D</p>
  </body>
</html>

вы будете уведомлены, что это не хорошо сформированный XML, так как атрибут checked не сопровождается равным знаком и значением.
Исправьте это, тогда вам скажут, что '&' - это недопустимый символ. Замените это соответствующим entity &amp;, тогда вы узнаете, что '>' также является незаконным персонажем.

инструмент, который вы пытаетесь использовать для анализа HTML как XML, безусловно, найдет некоторую ошибку этот вид. Как только он находит первый, он перестает обрабатывать ваш не очень хорошо сформированный XML-документ.

у вас все равно будет шанс, если HTML-страница, которую вы пытаетесь разобрать, хорошо сформирована XHTML 1.0 strict или XHTML 1.1...