парсер html на C++

Модератор: Модераторы разделов

luncher
Сообщения: 84
ОС: mandriva 2008 spring

парсер html на C++

Сообщение luncher »

недавно занимаюсь программированием, понадобилось написать парсер html страниц на предмет некой инфы(не ссылок), подскажите с помощью каких библиотек это можно реализовать.
Заранее спасибо!
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

да и желательно чтобы для этих библиотек была документация нормальная, нето библиотеки нахожу, а документации нету :-)
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: парсер html на C++

Сообщение RasenHerz »

ну если надо просто что-то найти в тексте, думаю Qt тут прекрасно подойдет. Именно парсеров(разбор текста) я не знаю - но думаю под конкретные нужды его не составит труда написать.
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

RasenHerz писал(а):
13.07.2009 01:05
ну если надо просто что-то найти в тексте, думаю Qt тут прекрасно подойдет. Именно парсеров(разбор текста) я не знаю - но думаю под конкретные нужды его не составит труда написать.

есть специальные либы, точно есть, самому трудно такое написать, тем более опыта в этом нет, поэтому и спрашиваю про библиотеки, есть проблема в том, что те что я нашел почти не документированы
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: парсер html на C++

Сообщение Denjs »

гм.... вы можете попытаться проанализировать часть источника заданий в моем OTDP.
он разбирает HTML-подобный исходник и создает из него XML-дерево. (несколько не так как было-бы напрямую из xhtml)
гм... мой парсер тоже несколько недокументирован, но все что есть - то по русски... в исходниках и немногочисленных доках.
Ну ещё я могу что-то подсказать.

...имхо... если знаете что такое машина состояний - там это самое сложное - то разберетесь. Ну ещё может доки по XML-классам в QT надо будет почитать. А остальное все достаточно простое.
Оно конечно там не самого лучшего вида (это было первое что я написал серьезного на QT c сигнал-слотами), но работает.
И на "реальном HTML" я его не гонял... но смотря что вам разбирать - может оно и пригодится.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: парсер html на C++

Сообщение svary »

luncher писал(а):
12.07.2009 22:43
написать парсер html страниц.

Вообще-то в *nix системах давным-давно существуют средства для таких задач.
В первую очередь : flex и jacc/bison :

Код: Выделить всё

FLEX(1)                          User Commands                         FLEX(1)
NAME
       flex - the fast lexical analyser generator

BISON(1)                                                              BISON(1)
NAME
       bison - GNU Project parser generator (yacc replacement)


ну, если совсем лень разбираться. можно awk попробовать :

Код: Выделить всё

GAWK(1)                        Utility Commands                        GAWK(1)
NAME
       gawk - pattern scanning and processing language


Это все утилиты, которые генерируют ИСХОДНЫЙ ТЕКСТ НА С. но, я так понял. что именно это Вам и надо ?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: парсер html на C++

Сообщение Portnov »

Ну у HTML грамматика довольно сложная, с кучей всяких "опциональных" частей (можно не закрывать многие теги итп), так что писать парсер даже на flex/bison весьма трудоёмко. Знатоки C/C++, неужели для этих языков нет готовых решений этой задачи!?

Для xml (и, соответственно, xhtml) даже я решение знаю - libxml. А для html...

Что-то здесь пошла речь про c/c++, хотя автор не указал, на каком языке пишет. На python, например, есть даже несколько парсеров html, на java афаик тоже...

UPD. Ой, в название темы-то не посмотрел :) Ну ладно, пусть будет c++.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
fbi
Сообщения: 34

Re: парсер html на C++

Сообщение fbi »

boost::regex вам в помошь! Документированно и с примерами! Не привязанно к GUI! Если надо на C++ то boost выручит!
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: парсер html на C++

Сообщение Portnov »

А в бусте чего-нибудь более конкретно для задачи автора нет? А то парсинг html с помощью регэкспов не есть гуд...
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

fbi писал(а):
13.07.2009 10:59
boost::regex вам в помошь! Документированно и с примерами! Не привязанно к GUI! Если надо на C++ то boost выручит!

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

Portnov писал(а):
13.07.2009 12:19
А в бусте чего-нибудь более конкретно для задачи автора нет? А то парсинг html с помощью регэкспов не есть гуд...

а почему плохо их использовать, обоснуйте пожайлуста
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

слышал где-то вроде что не очень хорошо использовать регулярные выражения для таких целей, но мне кажется что для задач типа моей это будет оптимальный вариант
Спасибо сказали:
Аватара пользователя
fbi
Сообщения: 34

Re: парсер html на C++

Сообщение fbi »

А в бусте чего-нибудь более конкретно для задачи автора нет?

Нет
А то парсинг html с помощью регэкспов не есть гуд...

Полностью согласен но....
понадобилось написать парсер html страниц на предмет некой инфы(не ссылок)

Смотря как, и что парсить!! Если необходимо выдрать email адреса и т.д. то лучше регулярок не придумаешь!
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

fbi писал(а):
13.07.2009 13:14
А в бусте чего-нибудь более конкретно для задачи автора нет?

Нет
А то парсинг html с помощью регэкспов не есть гуд...

Полностью согласен но....
понадобилось написать парсер html страниц на предмет некой инфы(не ссылок)

Смотря как, и что парсить!! Если необходимо выдрать email адреса и т.д. то лучше регулярок не придумаешь!

необходимо выдернуть инфу типа погоды, или курсов валют, из этой серии
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: парсер html на C++

Сообщение Portnov »

luncher писал(а):
13.07.2009 12:24
а почему плохо их использовать, обоснуйте пожайлуста

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

Если вам не надо парсить весь html, а только вытянуть определённую инфу - смотрите сами, насколько легко будет написать регэксп для этой инфы.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

Portnov писал(а):
13.07.2009 16:46
luncher писал(а):
13.07.2009 12:24
а почему плохо их использовать, обоснуйте пожайлуста

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

Если вам не надо парсить весь html, а только вытянуть определённую инфу - смотрите сами, насколько легко будет написать регэксп для этой инфы.

может и не очень легко, но других подходящих вариантов предложено небыло
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: парсер html на C++

Сообщение frp »

Можно парсить валидный xhtml как xml. Для этого есть libxml и Qt (есть SAX-парсер, сходный с libxml и DOM-парсер, который превращает XML в дерево).

А можно простой html в xhtml превратить (там, правда, есть проблема - некоторые ОЧЕНЬ наглые программисты и WYSIWYG-редакторы делают целую кучу ошибок в коде, которые сложно обрабатывать - здесь смотрите исходники Gecko или другого движка).
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

я собираюсь парсить информацию только с авторитетных и звестных сайтов, думаю что проблема плохих програмистов и редакторов мне вроде как не страшна
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: парсер html на C++

Сообщение Denjs »

luncher писал(а):
13.07.2009 23:33
я собираюсь парсить информацию только с авторитетных и звестных сайтов, думаю что проблема плохих програмистов и редакторов мне вроде как не страшна
ЫЫЫЫХ, МОЛъДОЙ ЧъЛОВЕЕКъ.... молодо-зелено... "код не хлебавше, да в омут без дебаггера" собираетесь? постерегитесь...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
fbi
Сообщения: 34

Re: парсер html на C++

Сообщение fbi »

Хм... из всего выше сказанного можно придти к выводу что... средств столь необходимых автору, конкретно под его задачу не существует (хотя может просто я про них не знаю). Автору не надо заниматься синтаксическим анализом html, а надо всего навсего получить какуюто информацию находящуюся на странице. На мой взгляд лучшим выходом было бы использовать регулярные выражения, а дальше смотрите сами. Возможно если luncher приведёт конкретный пример для рабочей задачи можно будет сказать что-то более конкретно!
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: парсер html на C++

Сообщение Voral »

fbi писал(а):
14.07.2009 08:11
Возможно если luncher приведёт конкретный пример для рабочей задачи можно будет сказать что-то более конкретно!


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

Регекспами распарсить вполне реально. Только не надо стараться сразу схватить одним выражением весь код. Както нужно было сделать это на php... если коротко, то парсил кажды тэг и сразу засовывал в многоуровниевый массив (по сути отражавший структуру документа).... Правда мне в процессе и сам массив этот был нужен.....



luncher писал(а):
13.07.2009 23:33
я собираюсь парсить информацию только с авторитетных и звестных сайтов, думаю что проблема плохих програмистов и редакторов мне вроде как не страшна

;) Точно уже не помню кто, но вроде А.Лебедев (по крайней мере раньше) забивал на валидность кода....
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: парсер html на C++

Сообщение frp »

luncher писал(а):
13.07.2009 23:33
я собираюсь парсить информацию только с авторитетных и звестных сайтов, думаю что проблема плохих програмистов и редакторов мне вроде как не страшна

Есть много даже достаточно известных сайтов, разработчики которых забивают на валидность. Не стоит доверять сайтам, на которых написано, что они валидны (я однажды нашел сайт, на котором написано снизу, что он валидный XHTML 1.0 Strict, так он оказался не XHTML 1.0 Strict, а HTML 4.01 Transitional, и содержал 3 ошибки).

UPD. Кстати, Linuxforum не валидный, Google тоже.
Спасибо сказали:
Аватара пользователя
altwazar
Сообщения: 427
Статус: Zz
ОС: Calculate

Re: парсер html на C++

Сообщение altwazar »

Я когда с подобным столкнулся, не делал парсеров html (сложновато для такой задачи). Просто получал страничку и седом выкусывал из нее нужные данные.
Спасибо сказали:
aikus
Сообщения: 6

Re: парсер html на C++

Сообщение aikus »

Если написание на C++ не принципиально, то можно посмотреть в сторону java, php etc. Там есть штатные и хорошо документированные средства.
Также можно немного почитать про программирование на платформе mozilla (я javascript имею ввиду).

Если на выходе нужен нативный код, то, как уже было сказано, можно покурить исходники браузерных движков, или ту же реализацию для php, java.

ИМХО. Наиболее простой способ - мозиловский javascript
Спасибо сказали:
Аватара пользователя
komcumir
Сообщения: 273
ОС: Alt 5.0

Re: парсер html на C++

Сообщение komcumir »

а разве perl не лучше всех с этим справится?
Спасибо сказали:
luncher
Сообщения: 84
ОС: mandriva 2008 spring

Re: парсер html на C++

Сообщение luncher »

perl а не знаю, с php дружу, но мне хотелось бы именно на C++
P.S. в пхп действительно это очень просто сделать
Спасибо сказали:
Аватара пользователя
komcumir
Сообщения: 273
ОС: Alt 5.0

Re: парсер html на C++

Сообщение komcumir »

luncher писал(а):
14.07.2009 16:01
perl а не знаю, с php дружу, но мне хотелось бы именно на C++
P.S. в пхп действительно это очень просто сделать

Если чесно считаю писать на си++ такое это извращение... Для каждого случая есть свой инструментарий... В вашем случае perl, php, tcl
Спасибо сказали:
Аватара пользователя
fbi
Сообщения: 34

Re: парсер html на C++

Сообщение fbi »

Если чесно считаю писать на си++ такое это извращение... Для каждого случая есть свой инструментарий... В вашем случае perl, php, tcl

Извращение знать по чуть-чуть кучу языков - вот это извращение! Если человек знает C++, и это знание не ограничивается только "Hello world", то естественно удобнее будет это делать на C++, и ни на чем больше!
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: парсер html на C++

Сообщение frp »

komcumir писал(а):
14.07.2009 16:16
Если чесно считаю писать на си++ такое это извращение...

Все извращение в том, что для работы с RegExp и парсинга XML используются сторонние библиотеки?

С RegExp в C++ не работал, а XML парсил (намного удобнее, чем в PHP)(когда-то пробовал написать конвертер docx в xhtml, забросил когда в OpenOffice появилась поддержка docx, на данный момент мой конвертер конвертирует только довольно простые тексты с картинками и частично переваривает таблицы, я так и не понял смысл многих docx-тегов (спецификации не нашел)).
Спасибо сказали:
Аватара пользователя
komcumir
Сообщения: 273
ОС: Alt 5.0

Re: парсер html на C++

Сообщение komcumir »

frp писал(а):
14.07.2009 16:31
(намного удобнее, чем в PHP)
ИМХО до PHP5 возможно, в 5 php парсинг xml просто не требуется как таковой он сам за вас все делает...


fbi писал(а):
14.07.2009 16:30
Если человек знает C++, и это знание не ограничивается только "Hello world", то естественно удобнее будет это делать на C++, и ни на чем больше!
Судя по топиктстартеру С++ он настолько не знает...
Спасибо сказали:
aikus
Сообщения: 6

Re: парсер html на C++

Сообщение aikus »

fbi писал(а):
14.07.2009 16:30
Извращение знать по чуть-чуть кучу языков - вот это извращение!

понимаю, что можем свалиться в священные войны, но всё же выскажусь.
Язык - это не цель, а инструмент для её достижения. Т.е. не плохо, если человек знает не один язык и способен выбирать между известными ему инструментами. С Вами, fbi, согласен, что если программист плохо ориентируется в выбранном инструменте, то это без условно плохо.
Спасибо сказали: