Главной целью (одной из, по крайней мере) переформулирования HTML в XML'ный синтаксис было упрощение парсинга веб-страниц. Очевидно, что парсить синтаксис, где ничего не опционально, все попарно, и где случившаяся ошибка становится известна сразу и является окончательной значительно проще, чем синтаксис, где каждая не-буква означает "попробовать угадать, что имел в виду автор документа". Поэтому и библиотек для парсинга XML'а полно под все языки, а HTML'ных, способных парсить реальные страницы... ну, в общем, не так много.
Но, как я уже рассказывал, идея с XHTML'ом на вебе слегка провалилась, потому что оказалось, что пользователям очень даже нужен тот плохоразбираемый мусор, которым заполнен веб, а насколько это трудно разработчикам, им не интересно.
Так вот, как я, опять же, уже писал, есть путь с другой стороны проблемы "сделать парсинг веба проще": не переделывать данные, а усложнять и дописывать парсеры. Этим, как известно, занимаются разработчики в Mozilla, Opera, KDE и Apple, пишут браузеры с жуткими страшными парсерами HTML'а. Для прочих же разработчиков парсинг HTML все еще проблема, потому что встраивать в свою утилитку несколько мегабайт чужого парсера, который никогда не был расчитан на встраивание, вряд ли кому-то понравится.
Но для программистов на Java теперь жизнь будет проще. Появился "TagSoup" — парсер HTML с SAX-совместимым API, работающий и со сломанным HTML'ом в том числе. Остается подождать, когда хорошую вещь портируют и на другие языки тоже.
Вот еще одно подтверждение того, что решение технических проблем техническими средствами работает лучше пламенных убеждений.
Комментарии: 11
А он (как мне показалось по названию), ничего не имеет общего с BeautifulSoup и клонами?
Продукт активно разрабатывается, тем не менее уже вполне работоспособен. Использую в паре проектов и другим рекомендую. К тому же автор отзывчев и доступен в мэйл-листе TagSoup Friends на Yahoo.
задача распарсить и отрендрить (как в броузере) отличается от просто распарсивания.
в питоне есть http://docs.python.org/lib/module-htmllib.html, парсит хтмл с sax-compatible api.
В пхп есть http://pear.php.net/package/XML_HTMLSax3 - тоже самое.
Так что библиотеки для распарсивания html есть давно. Никто из них правда не занимается коррекцией исходника, но у меня большине сомнения что эта функция востребована.
Вот в этом и вся разница, почему я выделил именно TagSoup. Это как раз та самая функция, которая востребована. Причем во многих случаях это не "коррекция", а просто выполнение совершенно легальных свойства HTML, как например опциональных открывающих и закрывающих тегов.
хм... можно пример из реальной жизни? кроме броузеров.
Функция востребована, но для нее есть Tidy. Иначе упаковка этих китовых кишок во что-то типа RSS-фида превращается в наказание.
Простейший пример. Когда вы пишите комментарий к этому блогу, вы пишите его в текстовом поле. Ах как было бы удобно выделять текст мышкой и форматировать его! Хочешь, создал таблицу, хочешь выделил курсивом, изменил шрифт и поменял цвет! И это возможно! И даже реализовано. Например, в gmail. В браузере создается специальный WYSIWYG объект с помощью которого ты можешь формировать HTML со всеми описанными прелестями (см. подробнее HtmlEditor в MSDN). И этот HTML нужно послать на сервер. Но сервер просто так HTML отобразить не сможет. А вдруг ты послал не закрывающуюся таблицу? И разметка на всем сайте из-за твоего комментария с незакрытым тэгом таблицы пойдет по бороде. А вдруг ты вставил javascript код? Для этого и существуют Html парсеры. Чтобы оставить нужное и отсеять все лишнее.
Ну для перл давно есть HTML::TreeBuilder (и иже с ним)прекрасно справляющийся с этими задачами. И со сломанным html он тоже вполне справляется. Правда, результат (дерево) иногда (не часто, зависит от "сломанности") отличается от того разбора браузера. Что в принципе не критично.
Мы используем XHTML, потому что у нас парсер работает и в самом framework и, в процессе работы, парсит шаблоны. Шаблоны много проще парсить, если они в XHTML, а не в HTML.
Для PHP уже несколько лет есть HTMLSax3, который парсит любой HTML. Кроме того, есть такая вещь как Tidy.
Появился порт TagSoup на плюсы:
http://www.jezuk.co.uk/cgi-bin/view/arabica/log?id=3591
WYSIWYG - не сложно, для этого в Мозиле давно есть примочка.
document.getElementById('editFrame').contentWindow.document.designMode = "on";
А в HTMLе просто вставить фрейм с id='editFrame'
А потом document.getElementById('editFrame').contentWindow.document.execCommand('bold', false, null); - для ну и тд
Код Мозилы открыт, никто не мешает портировать ее парсер на Perl или что-либо другое