Главной целью (одной из, по крайней мере) переформулирования HTML в XML'ный синтаксис было упрощение парсинга веб-страниц. Очевидно, что парсить синтаксис, где ничего не опционально, все попарно, и где случившаяся ошибка становится известна сразу и является окончательной значительно проще, чем синтаксис, где каждая не-буква означает "попробовать угадать, что имел в виду автор документа". Поэтому и библиотек для парсинга XML'а полно под все языки, а HTML'ных, способных парсить реальные страницы... ну, в общем, не так много.

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

Так вот, как я, опять же, уже писал, есть путь с другой стороны проблемы "сделать парсинг веба проще": не переделывать данные, а усложнять и дописывать парсеры. Этим, как известно, занимаются разработчики в Mozilla, Opera, KDE и Apple, пишут браузеры с жуткими страшными парсерами HTML'а. Для прочих же разработчиков парсинг HTML все еще проблема, потому что встраивать в свою утилитку несколько мегабайт чужого парсера, который никогда не был расчитан на встраивание, вряд ли кому-то понравится.

Но для программистов на Java теперь жизнь будет проще. Появился "TagSoup" — парсер HTML с SAX-совместимым API, работающий и со сломанным HTML'ом в том числе. Остается подождать, когда хорошую вещь портируют и на другие языки тоже.

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

Комментарии: 11

  1. Зверёк Харьковский

    А он (как мне показалось по названию), ничего не имеет общего с BeautifulSoup и клонами?

  2. TLoD,Snake

    Продукт активно разрабатывается, тем не менее уже вполне работоспособен. Использую в паре проектов и другим рекомендую. К тому же автор отзывчев и доступен в мэйл-листе TagSoup Friends на Yahoo.

  3. Alex Zhukov

    задача распарсить и отрендрить (как в броузере) отличается от просто распарсивания.
    в питоне есть http://docs.python.org/lib/module-htmllib.html, парсит хтмл с sax-compatible api.
    В пхп есть http://pear.php.net/package/XML_HTMLSax3 - тоже самое.

    Так что библиотеки для распарсивания html есть давно. Никто из них правда не занимается коррекцией исходника, но у меня большине сомнения что эта функция востребована.

  4. Иван Сагалаев

    Никто из них правда не занимается коррекцией исходника, но у меня большине сомнения что эта функция востребована.

    Вот в этом и вся разница, почему я выделил именно TagSoup. Это как раз та самая функция, которая востребована. Причем во многих случаях это не "коррекция", а просто выполнение совершенно легальных свойства HTML, как например опциональных открывающих и закрывающих тегов.

  5. Alex Zhukov

    хм... можно пример из реальной жизни? кроме броузеров.

  6. Julik

    Функция востребована, но для нее есть Tidy. Иначе упаковка этих китовых кишок во что-то типа RSS-фида превращается в наказание.

  7. Ro

    хм… можно пример из реальной жизни? кроме броузеров.

    Простейший пример. Когда вы пишите комментарий к этому блогу, вы пишите его в текстовом поле. Ах как было бы удобно выделять текст мышкой и форматировать его! Хочешь, создал таблицу, хочешь выделил курсивом, изменил шрифт и поменял цвет! И это возможно! И даже реализовано. Например, в gmail. В браузере создается специальный WYSIWYG объект с помощью которого ты можешь формировать HTML со всеми описанными прелестями (см. подробнее HtmlEditor в MSDN). И этот HTML нужно послать на сервер. Но сервер просто так HTML отобразить не сможет. А вдруг ты послал не закрывающуюся таблицу? И разметка на всем сайте из-за твоего комментария с незакрытым тэгом таблицы пойдет по бороде. А вдруг ты вставил javascript код? Для этого и существуют Html парсеры. Чтобы оставить нужное и отсеять все лишнее.

  8. Den

    Ну для перл давно есть HTML::TreeBuilder (и иже с ним)прекрасно справляющийся с этими задачами. И со сломанным html он тоже вполне справляется. Правда, результат (дерево) иногда (не часто, зависит от "сломанности") отличается от того разбора браузера. Что в принципе не критично.

  9. BOLK

    Мы используем XHTML, потому что у нас парсер работает и в самом framework и, в процессе работы, парсит шаблоны. Шаблоны много проще парсить, если они в XHTML, а не в HTML.

    Для PHP уже несколько лет есть HTMLSax3, который парсит любой HTML. Кроме того, есть такая вещь как Tidy.

  10. Evgeny

    Появился порт TagSoup на плюсы:
    http://www.jezuk.co.uk/cgi-bin/view/arabica/log?id=3591

  11. iZen

    WYSIWYG - не сложно, для этого в Мозиле давно есть примочка.
    document.getElementById('editFrame').contentWindow.document.designMode = "on";

    А в HTMLе просто вставить фрейм с id='editFrame'
    А потом document.getElementById('editFrame').contentWindow.document.execCommand('bold', false, null); - для ну и тд

    Код Мозилы открыт, никто не мешает портировать ее парсер на Perl или что-либо другое

Добавить комментарий