Поиск по блогу

четверг, 27 августа 2009 г.

DOM vs. RegExp on PHP

dom regexp on php
Последние 2 недели было несколько заказов на написание парсеров на PHP. И я за них бралась, в основном за чисто символическую плату, чтобы повариться в PHP-шной кухне, попробовать разные способы парсинга и, заодним, подучиться не на чистом энтузиазме. ;)

Хочу рассказать о своих впечатлениях.

Парсер на PHP — это удобно и менее време- и ресурсозатратно для разработчика. Естественно, если скрипт предназначен только для скачивания какой-либо базы и последующей проверки обновлений. Ни тебе особых интерфейсов, ни тебе всяких ненужных классов: скачиваешь страницу, парсишь, в базу, по кругу. Для многофункционального ПО по-прежнему использую Delphi.

Скрипты удобны для удаленного запуска по расписанию (не забудьте установить set_time_limit(), чтобы скрипт не останавливался, не доработав до конца).

Когда-то я спрашивала читателей блога, чем удобнее парсить, регулярками или через библиотеку DOM. Тогда прозвучал только один конкретный ответ. Что ж, зато у меня был повод самостоятельно потестировать разные инструменты. Что могу сказать по поводу того, каким способом удобнее парсить html? Чаще всего я все-таки использовала регулярные выражения, потому что привыкла, наверное. Пару раз использовала комбинированный метод: сначала большой табличный кусок "добывала" регуляркой, а потом уже эти хорошо структурированные данные разбирала через DOM.

Чем неудобна библиотека DOM? Тем, что она все-таки не очень хорошо разбирает данные, если они невалидны. Если у вас включено отображение ошибок (php_value display_errors 1), вы можете легко убедиться в этом, взяв произвольный ресурс и попробовав загрузить его страницу в dom-объект

$dom->loadHTML($html);


Выдается список ошибок: то неизвестный тэг, то точка с запятой лишняя, то еще какая-нибудь фигня.

Так что мой выбор все-таки в пользу регулярок, а dom я оставляю для парсинга XML.

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



4 комментария:

  1. Добрый день
    А каким образом в Delphi решается вопрос "просмотр вперед" ?
    Есть у меня выражение
    (?=<span>)(.*?)(?=<\/span>)
    Результат такой:
    <SPAN>Crespi Estates

    Если делаю так:
    (?<=<span>)(.*?)(?=<\/span>)

    Возникает ошибка, а в тестере все нормально. =(

    ОтветитьУдалить
  2. simplehtmldom - отличный парсер!
    Если что то и парсюто только им.
    Кончено не только им, но и регулярками. Но в начале я полюбому выдеркиваю кусок текста/кода из html спомощью simplehtmldom, а потом уже этот кусок отдаю регуляркам так получается занчительно быстрей!

    ОтветитьУдалить
  3. > Пару раз использовала комбинированный метод:
    > сначала большой табличный кусок "добывала" регуляркой,
    > а потом уже эти хорошо структурированные данные
    > разбирала через DOM.

    Я немного не так комбинирую.
    Есть такая функция: strip_tags ( string str [, string allowable_tags] )

    Так вот все забывают про allowable_tags

    А зря. Ведь вы можете оставить только нужные вам для парсинга теги. Затем добавить в начало и конец html и body, чтобы получился валидный html. А дильше уже при помощи DOM разбирать.

    Регулярки хороши, но мне они кажутся медленными.

    ОтветитьУдалить
  4. > Скрипты удобны для удаленного запуска по расписанию
    > (не забудьте установить set_time_limit(),
    > чтобы скрипт не останавливался,
    > не доработав до конца).

    На шаред-хостингах не всегда есть такая возможность. Скорее ее нет, как правило.

    Тут я такую хитрость советую -- делите скрипт на три части: извлекатель ссылок, скачиватель, парсер.

    Извлекатель просто анализирует начальный html и складывает ссылки на закачку в файл.

    Затем по крону запускаете wget, который скачивает все страницы в папку.

    А дальше уже скачанные файлы распарсиваете и снова по кругу.

    Таким образом можно дикие объемы прогнать.

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться