2012-02-03 2 views
0

По различным причинам, выходящим за рамки этого вопроса, я использую класс 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&#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> 

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

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

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

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

спасибо!

+0

Я не знаю, хорошо ли это, но вместо игнорирования тега вы можете запомнить его и продолжить. При следующем несоответствии посмотрите, будет ли запоминаемый тег разрешать несоответствие, и если это так, используйте его вместо текущего несоответствия. – Christoph

ответ

0

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

+0

В случае, если у вас нет доступа к пользовательскому вводу _original_, но вы знаете, где именно он начинается в документе, вы можете проанализировать документ и удерживать стек тегов к моменту запуска пользовательского HTML. Затем перейдите к концу документа и проверьте, не возникли ли у вас расплывчатые раскладки. –

Смежные вопросы