среда, 22 октября 2008 г.

Парсинг HTML для нахождения ссылок

Привет. Как оказалось, сложно наметить линию для логичного изложения материалов, по которым наилучшим образом можно научиться писать парсеры. Главная причина — это, все-таки, наличие множества потенциальных "точек приложения", "мест применения" парсеров. А изучение проще всего проводить на конкретном примере. В настоящее время у меня нет заданий на парсеры, а брать пример из головы только для того, чтобы написать и выкинуть, — не хочется. Судя по статистике фидбёрнера, этот блог уже читаю не одна я. :) Хотелось бы узнать у читателей, какие их интересуют вопросы, на примере чего лучше еще раз показать процесс создания программы.

А пока в этом посте я затрону следующую тему...

При программировании парсера могут возникать вопросы общего плана (алгоритм, модульность, структура данных) и множество мелких вопросов (исследование исходных данных, составление регулярных выражений). Хочу привести пример хода рассуждений при составлении универсального регулярного выражения для нахождения ссылок. В свое время, когда я училась составлять регулярные выражения, наткнулась на статью PHP: Parsing HTML to find Links (специально нашла еще раз). В ней автор по полочкам описывает процесс составления регулярного выражения. Его рассуждения очень полезные. Вот почему: когда мы парсим один ресурс, на котором все ссылки оформлены по единому стандарту, — мы легко составим регулярку. Но что делать, если ресурсов много? Допустим, на одном теги написаны строчными буквами, а на другом заглавными, да еще и с дополнительными атрибутами?

Если вкратце, то автор статьи выделяет следующие шаги:

1. Составляем самое-самое простое регулярное выражение для нахождения ссылки:
/<a href=\"([^\"]*)\">(.*)<\/a>/iU

Это элементарное регулярное выражение. В нем можно выделить несколько частей:
- ссылка начинается с <a href="
- далее до следующей закрывающей скобки (") идет набор символов, представляющий собой непосредственно URL
- строка ">
- набор символов, представляющий собой текст ссылки
- окончание ссылки </a>

Далее заменяем в нем пробелы на символы пробелов.

2. Предусматриваем места для дополнительных атрибутов (сами выражения лучше посмотрите на сайте-источнике, там все красиво выделено цветом, в блоггере у меня так не получится без дополнительных хлопот :) )

3. Допускаем, что ссылка может квотироваться, а может и не квотироваться (то есть может быть и не заключена в кавычки).

4. Вносим еще несколько поправок:
- Знак "=" может быть обрамлен пробелами (но они могут и отсутствовать);
- Если нам нужны только ссылки с "http" (а не с ftp и т.д.) - отмечаем это... и т.д.

В общем, очень и очень неплохой пример стандартизации и универсализации :)

13 комментариев:

  1. Маша, пиши, не останавливайся. все очень полезно. поставил ссылку на тебя.
    >>Хотелось бы узнать у читателей, какие их интересуют вопросы, на примере чего лучше еще раз показать процесс создания программы.

    Очень интерисует процесс разбора rss на делфях, только все в малейших подробностях, потому что в делфях я делал только маленький справочник имен и это было два года назад =) И освяти, пожалуйста, подробно процесс создания имитации браузера. Если конкретно- как заставить скрипт заходить в админку вордпресса и редактировать заметки, поля, виджеты.
    Раз ты говоришь что не знаешь о чем писать- пиши об этом)) очень очень очень важно лично для меня. заранее спасибо

    ОтветитьУдалить
  2. p.s. поставь попрошайку вебманевскую а не яндексовскую=)

    ОтветитьУдалить
  3. Привет, mr.Hide :) Хорошо, про RSS напишу еще раз с примером на Delphi. Что касается захождения скрипта в админку вордпресса... мне кажется, это нерационально и в корне неправильно - заходить всюду скриптом или какой-либо прогой. Для этого надо просто изучить структуру базы wp и работать напрямую с этой базой, генерируя к ней ddl-запросы. Структура базы подробно разобрана в инете. Чтобы наполнить базу - надо просто составить правильные insert-ы )) Все виджеты и т.д. - тоже редактируются через базу.

    Пока тут все молчали, я подумала было расписать процесс парсинга на примере генератора контента для форума phpbb. Как раз начиная с анализа базы данных, потом о работе через Delphi с MySQL... прога бы парсила профили, темы и сообщения и записывала бы все в базу... на выходе бы получился наполненный клон форума.

    Если хочешь - могу то же самое разобрать только на примере базы WordPress.

    Спасибо, что читаешь))

    ОтветитьУдалить
  4. >>Спасибо, что читаешь))
    Спасибо что пишешь!!! Хотя у меня двоякое чувство. С одной стороны мне это все полезно, с другой стороны мне жалко то что это открыто для всеобщего рассмотрения. хых

    >>это нерационально и в корне неправильно - заходить всюду скриптом или какой-либо прогой.

    вот тут поподробней, пожалуйста. Мне мой прогер на пхп сказал что так наоборот выгодней. В сравнении с постингом на вордпресс через протокол xml-rpc. Опять же, к БД я могу получить доступ только в том случае, если сайт установлен лично на моем хостинге. А если я зарегался как пользователь wordpress.com? Тогда мы уже не получим доступа в базу. Вот такая палка о двух концах.
    Я вот хочу у тебя спросить. Если будет 10 000 сайтов. И все должны обрабатываться прогой. Через имитацию браузера, захода в админку. Скрипт написанный на пхп это выдержит? С распределением нагрузки во времени за счет крона... А скрипт написанный на делфи? А если не через имитацию браузера, а работу с БД напрямую? А через xml-rpc?))) Ой сколько вопросов)) Расскажи, пожалуйста, что думаешь обо всем этом. У меня пока некая каша манная в голове

    ОтветитьУдалить
  5. кстати, делфи в свое время бросил так как на sql.ru начитался кучи мнений о том что делфи не очень-то подходит для веб-разработки. Твое мнение по этому заявлению?

    ОтветитьУдалить
  6. Да, если дневник на блог-хостинге, то SQL-запросы, конечно, не подойдут... А с php я не настолько хорошо знакома, чтобы оценить, с чем скрипты справятся, а с чем нет. Надо пробовать. К тому же, ты говоришь о таких масштабах, которые я себе даже представить не могу )))

    А ты хочешь, чтобы все было автоматически? То есть чтобы информация откуда-то бралась и публиковалась в дневниках? Это ж проге надо круглосуточно работать!)) Для таких целей лучше подошли бы скрипты, но опять же - не могу ничего сказать по оценке нагрузки...

    Еще я знаю, что на li.ru даже создана специальная прога, которая позволяет публиковать записи в свои дневники под разными аккаунтами. Для wordpress.com официально ничего подобного нет... но, безусловно, сделать так, чтобы работать со всеми дневниками через один интерфейс - это можно без проблем.

    По поводу делфей... я описываю тут все на делфях, потому что они мне ближе и потому что на основной работе я работаю именно с ними) Да, я тоже читала, что есть более подходящие инструменты для работы с вебом, но мне совсем не хочется устанавливать и с нуля изучать дотнет, например))) Тем более, что в моих планах нет пункта "распарсить весь интернет")) Для моих задач хватает утилит на делфи, мне не принципиально быстродействие и работа с объемами информации в промышленных масштабах.

    ОтветитьУдалить
  7. >>А ты хочешь, чтобы все было автоматически? То есть чтобы информация откуда-то бралась и публиковалась в дневниках?

    Да, я хочу чтобы инфо из разных мест публиковалось на дневники. Причем разработана система в которой инфо разделяется, сортируется, помечается, выделяется..... Вообщем задачи проги не ограничиваются одной лишь публикацией. Вот счас когда я пробую делать на пхп в упрощенном варианте, то обработка 12 дневников занимает 2,5 минуты примерно. Хостер уже жалуется. Лимит на время выполнения скрипта не выдерживает, приходится обходить. Поэтому я все чаще поглядываю в сторону делфи. Хочу как два года назад (или уже три?:( ) начать осваивать и писать самому.

    >>Еще я знаю, что на li.ru даже создана специальная прога, которая позволяет публиковать записи в свои дневники под разными аккаунтами.

    Ну и на вордпресс для этих целей используется xml-rpc. Определенному файлу передается запрос с именем пользователя, паролем, тегами, заголовком, содержанием. И выполняется. Хотя это наверное не то что ты говоришь есть на лиру.

    Хых....
    >>Если хочешь - могу то же самое разобрать только на примере базы WordPress.
    хочу)) любые уроки в создании делфийской проги для работы с вордпрессом приму с благодарностью.
    Я задам один нескромный вопрос, буду рад если ответишь) Какова твоя зарплата в оффлайне? или средняя зарплата прогера-дельфиста?
    Спасибо.

    ОтветитьУдалить
  8. Я с xml-rpc не работала, не знаю)

    Насчет твоего замысла... Дааа, планы наполеоновские)) Зачем тебе столько дневников? На блогуне зарабатывать? А содержимое постов будешь через синонимайзер прогонять или контент будет неуникальным? Воровать контент - это же не очень хорошо ;)))) Лучше, по-моему, сделать систему полуавтоматическую и разбить процесс на 3 этапа: сбор и сортировка контента, изменение контента и утверждение плана распределения (что куда пойдет), непосредственно постинг.

    А еще, на мой взгляд, лучше вложить больше труда, но перестраховаться: автоматизировать постинг не только на wordpress.com, но и на другие блог-хостинги. Во-первых, вордпресс очень тормозит (специально зашла и посмотрела), а во-вторых - надо контролировать риски. То есть вместо, допустим, 100 блогов на вордпресс.ком создаешь там только 20, еше по 20 - на ли.ру, ливджорнале, мейл.ру и т.д. И постишь в день, допустим, на 5 блогов с каждого сервера. Так тебя с твоей сеткой сложнее будет вычислить и меньше вероятность бана... хотя, если ходить через прокси... в общем, сам решай)

    З/п свою здесь озвучивать не буду)) но на сколько мне известно, средняя з/п 60-80 тыс.. На хлеб с маслом хватает, но приходится ведь еще откладывать на квартиру и т.д... да еще кризис подоспел некстати и з/п перестали расти (

    ОтветитьУдалить
  9. >>Зачем тебе столько дневников? На блогуне зарабатывать?

    зарабатывать. но не на блогуне=)

    >>Воровать контент - это же не очень хорошо ;))))

    гораздо лучше остаться жить в подъезде где живут наркоманы, кругом блевотина моча, и где норм человеки опасаются за свою жизнь?=)
    выбора не остается

    >>сделать систему полуавтоматическую и разбить процесс на 3 этапа: сбор и сортировка контента, изменение контента и утверждение плана распределения (что куда пойдет), непосредственно постинг.

    это да. буду пробовать на делфи все это писать

    >>лучше вложить больше труда, но перестраховаться: автоматизировать постинг не только на wordpress.com, но и на другие блог-хостинги.

    нууу.... не один вордпресс.ком есть. есть куча других блог-хостингов на вордпрессе и есть свои сервера для вордпрессов.=) ну а лиру и прочее- это можно уже тогда когда с вордпрессом все будет готово. рациональный вполне подход)

    ОтветитьУдалить
  10. Ясно) Ну, если что, чем смогу — помогу)) Почта в профиле указана ;)

    ОтветитьУдалить
  11. хых... ну платить мне пока нечем. Особенно если зарплата дельфистов 60-80т.р.)) Так что буду ждать новых заметок на блоге=)

    ОтветитьУдалить
  12. Э-э-э, я не имела в виду платную помощь)))

    ОтветитьУдалить
  13. Добрый день, подскажите пожалуйста можно ли с помощью регулярных выраженй в строке вида:
    XXx('неизвестно','неизвестно2','...','неизвестноN')
    найти все неизвестные??? Как будет выглядеть строка для поиска??
    C уважением bay.

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

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

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