Разве это не подходящий сценарий для синтаксического анализатора HTML?

Мне приходится иметь дело с неверными тегами Html и Html внутри атрибутов Html:

<p class="<sometag attr="something"></sometag>">   
    <a href="<someothertag></someothertag">Link</a>
</p>

Я попытался использовать HtmlAgilityPack для анализа содержимого, но когда вы загружаете приведенный выше код в HtmlDocument, OuterHtml выводит:

<p class="<sometag attr=" something"="">">
    <a href="<someothertag></someothertag">Link</a>
</p>

Тег p становится искаженным, а someothertag внутри атрибута href тега a не распознается как узел (хотя на самом деле это текст внутри атрибута, я бы хотел, чтобы он распознавался как тег).

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


person Omar    schedule 24.07.2011    source источник
comment
Боюсь, вы не сможете разобрать что-то подобное. По крайней мере, не так, чтобы всегда работало так, как вы этого хотите. Зачем вам нужно разбирать что-то ужасное, как это?   -  person svick    schedule 24.07.2011
comment
Хочу ли я вообще знать, кто/что может произвести такую ​​вещь?   -  person ChaosPandion    schedule 24.07.2011
comment
Это пользовательский синтаксис шаблонов, с которым мне нужно иметь дело.   -  person Omar    schedule 24.07.2011


Ответы (2)


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

Основная проблема, которую я вижу, заключается в том, что внутри значения атрибута есть наборы двойных кавычек. Гарантируется ли, что разметка всегда будет иметь соответствующий закрывающий символ для каждого открытия? Другими словами, для каждого будет > и для каждого открытия " или ' соответствующий знак закрытия?

Если это так, я бы предложил взять исходный код для синтаксического анализатора HTML, такого как Html Agility Pack, и добавить некоторые функции к синтаксическому анализу атрибутов. Используйте стек; для каждого открывающего символа нажимайте его, а затем читайте, пока не найдете другой открывающий или закрывающий символ. Если он открывается, нажмите на него, если он закрывается, нажмите на него.

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

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

person Tyson    schedule 24.07.2011

это недопустимый html, поэтому я не думаю, что вы можете полагаться на парсер html для его анализа.

person Jason    schedule 24.07.2011