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

среда, 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.

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

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

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

Поделиться