По различным причинам, выходящим за рамки этого вопроса, я использую класс adhoc html parsing, написанный на python. Этот простой класс до сих пор был достаточным для того, чтобы вводить его, но он недавно пытался разобрать http://forum.macbidouille.com/index.php?showtopic=160607Обработка ошибок при разборе HTML
Эта страница, очевидно, автоматически генерируется кодом 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'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'ai pas de télévision !</div>
</div>
Как должно быть очевидно из вышесказанного, существует паразитная тег, который закрывается слишком рано. т. е. здесь имеется неверный код. Ничего экстраординарного, но этого достаточно, чтобы мой код синтаксического анализа не прошел. В частности, до сих пор этот код синтаксического анализа имеет очень простую стратегию обработки ошибок: он просто пытается сопоставить каждый закрывающий тег с открытым тегом и если закрывающий тег не совпадает, он игнорируется.
В случае вышеуказанного кода это приводит к игнорированию в строке 7, поскольку оно не соответствует текущему открытому тегу из строки 5, а затем игнорируется в последней строке, поскольку оно не совпадает с открытым тегом в настоящее время в строке 2 В результате весь html, который следует за этим блоком, считается иерархическим, включенным в первый тег, что приводит к другим проблемам позже.
Что я хотел бы достичь, так это «синхронизировать» состояние синтаксического анализа, и мне интересно, какой простой подход приведет к синтаксическому анализатору, который может обрабатывать этот блок html. Я могу видеть, как я мог бы попытаться свести к минимуму количество закрывающих тегов, отброшенных после того, как я завершил разбор, повторно создав сгенерированное дерево, но я ищу более простое решение.
Я знаю, что первым ответом будет: «использовать библиотеку X», и это, вероятно, то, что я собираюсь закончить, но мне действительно интересно узнать, какие интересные стратегии анализа и обработки ошибок могут быть использованы в Это дело. т. е. я пытаюсь получить образование :)
спасибо!
Я не знаю, хорошо ли это, но вместо игнорирования тега вы можете запомнить его и продолжить. При следующем несоответствии посмотрите, будет ли запоминаемый тег разрешать несоответствие, и если это так, используйте его вместо текущего несоответствия. – Christoph