Обработка ошибок при разборе HTML - PullRequest
0 голосов
/ 03 февраля 2012

По различным причинам, которые выходят за рамки этого вопроса, я использую класс синтаксического анализа adhoc html, написанный на python.Этот простой класс до сих пор был достаточным для того типа ввода, который он выдавал, но недавно он пытался проанализировать http://forum.macbidouille.com/index.php?showtopic=160607

Эта веб-страница, очевидно, автоматически генерируется некоторым php-кодом, но она содержит сгенерированный пользователем HTML,включается дословно в качестве подписи для каждого поста.В частности, http://forum.macbidouille.com/index.php?showtopic=160607#entry1563022 содержит следующий HTML-код (комментарии удалены и теги с отступом для ясности):

<div class="signature">
  <span style="font-family:Verdana">
    <span style="color:#8B0000">
      <span style="font-size:12pt;line-height:100%">
        <div align='center'>La Culture coûte cher, mais l&#39;inculture coûte encore plus cher à la Société. <br />
          <span style="font-size:8pt;line-height:100%"><i>Marcel Landowsky</i></span>
      </span><br />
        </div>
      </span>
    </span>
  <div align='left'><br />macbook unibody 10.6.8 - 2.26ghz - 4Go- 250Go - <br />Je n&#39;ai pas de télévision &#33;</div>
</div>

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

ВВ случае приведенного выше кода это приводит к игнорированию в строке 7, поскольку он не соответствует открытому в настоящее время тегу из строки 5, а затем игнорированию в последней строке, поскольку он не соответствует открытому в настоящее время тегу в строке 2. В результате всепредполагается, что html, следующий за этим блоком, иерархически включен в первый тег, что позже приведет к другим проблемам.

Чего я хотел бы добиться, так это «лучше синхронизировать» состояние анализа, и мне интересно, какого родапростой подход привел бы к парсеру, который может обрабатывать этот блок HTML.Я вижу, как можно попытаться свести к минимуму количество выбрасываемых закрывающих тегов после завершения анализа путем реорганизации сгенерированного дерева, но я ищу более простое решение.

Я знаю, что первым ответом будет: «использовать библиотеку X», и это, вероятно, то, чем я собираюсь в конечном итоге заниматься, но мне действительно интересно, какие интересные стратегии анализа и обработки ошибок могут бытьиспользуется в этом случае.то есть я пытаюсь получить образование:)

спасибо!

1 Ответ

0 голосов
/ 03 февраля 2012

Лучше всего сначала попытаться проанализировать (и исправить) предоставленный пользователем HTML-код, в противном случае вы можете столкнуться со всеми видами искажений исходной структуры DOM.Во-первых, я думаю, вы должны проверить пользовательский HTML на наличие вложенности тега и очистить его (т. Е. </span> не имеет соответствующего начального тега, поэтому его следует удалить).Если у вас есть анализатор только для HTML, заключите пользовательский HTML в <div>..</div> перед анализом - это должно сработать.

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