Разве это не подходящий сценарий для анализатора HTML? - PullRequest
0 голосов
/ 24 июля 2011

Мне приходится иметь дело с искаженными тегами 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, как это?

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

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

1 голос
/ 24 июля 2011

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

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

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

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

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

...