vk_barnaul » 21.09.2015 19:54:44
немного углубившись в алгоритм я пришел к выводу, что вполне безопасно парсить UTF8 страницы и в том виде в котором есть. По крайней мере пока я не обнаружил проблемы. А почему у меня возник вообще вопрос - я заметил что парсится странички не совсем так как хотелось бы. И первое что увидел, что парсинг идет посимвольный, поэтому и подумал, что проблема в кодировке UTF8 и многобайтных символах. Проблема оказалась в другом:
unit SAX_HTML;
....
procedure THTMLToDOMConverter.ReaderEndElement(Sender: TObject;
....
вызывается реадером каждый раз, когда "закрываем" какой-нибудь тэг. Т.к. html странички бывают совсем разные, в том числе и не совсем корректные автор алгоритма держит список обработанных, но не закрытых тэгов в списке FElementStack. При очередном закрытии тэга (назовем Node1) находим самый последний не закрытый с нужным нам именем и всё что не закрылось до него закрываем и делаем их детьми Node1.AppendChild.
сам элемент Node1 оставляем в стэке, чтобы кто-нибудь его сделал своим "ребенком". Но если в следующий раз закроется тэг с таким же именем, мы вместо того чтобы закрыть следующий элемент опять видим Node1 и радостно работаем с ним.
Хорошо и наглядно это можно увидеть обработав что-то типа этого:
<html>
<div id="level1">
<div id=level2">
<div id="level3">
</div>
</div>
</div>
</html>
вместо вложенного три раза div получим список одноуровневый список из трех div. т.к. судя по SVN это не менялось с 2005 года - никто с таким не сталкивался.
разубедите, плз, меня = где я не прав ??