Парсим страницы, тащим e-mail

By bitonic

Сразу скажу, что эта статейка для программистов на C++. Ходил по форумам и заметил, что народу нужно отпарсить html страницу и вытянуть оттуда все e-mail. Но почти всегда «глас страждущего в пустыне» остается не услышанным – те, кто знают как парсить – не хотят говорить, а те, кто не знают – дают какие-то общие советы, подчастую, не по теме. Решил частично восполнить этот пробел. Способов парсинга несколько: Boost, PCRE, Td1 и др. Пробовал разобраться с ними, но так как я жутко ленивый, то не хватило сил и мотивации, чтобы вникнуть в архитектурно-шизофренические особенности этих библиотек. Поэтому решил, что лучше самому написать алгоритм парсинга. Для этого я использовал связку C++ (MSVC++ 2008) & STL (моя самая любимая библиотека) . Алгоритм прост: находим в строке символ «@», декрементируем позицию влево от «@» до самого первого символа e-mail и фиксируем начало, инкрементируем позицию вправо от «@» до самого последнего символа e-mail и фиксируем конец, копируем символы с начала до конца, выводим на экран готовый e-mail.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>

using namespace std;

string ExtractEmail(string &strIN)
{
string tmpStr;
string::size_type idxAt,idxEmailBegin,idxEmailEnd;
idxAt=strIN.find(«@»); //ищем символ «@»
if(idxAt!=string::npos)
{
idxEmailBegin=idxAt;
//ищем самый первый символ e-mail
do
{
idxEmailBegin–;
}while(isalnum(strIN.at(idxEmailBegin)) || strIN.at(idxEmailBegin)==’.’ || strIN.at(idxEmailBegin)==’-');
idxEmailEnd=idxAt;
//ищем самый последний символ e-mail
do
{
idxEmailEnd++;
if(idxEmailEnd>=strIN.size())
return «»;
}while(isalnum(strIN.at(idxEmailEnd)) || strIN.at(idxEmailEnd)==’.’ || strIN.at(idxEmailEnd)==’-');
string email;
//Копируем в пременную «email» все символы
//- с первого по последний
for(UINT i=idxEmailBegin+1; i<idxEmailEnd; i++)
email+=strIN.at(i);
//возвращаем готовый e-mail
return email;
}
else
return «»;
}

int _tmain(int argc, _TCHAR* argv[])
{
//строка для парсинга
string rawT=»<a href= target=_blank>1</a>my.mail-box@gmal.com</td>»;
//получаем e-mail, если он есть
string tmp=ExtractEmail(rawT);
//выводим результат на экран
cout << tmp.c_str() << endl;
return 0;
}

В результате программа выводит: my.mail-box@gmal.com

Я человек жадный $:-) , поэтому этот алгоритм не полный (за полный денюжку платить надо, однако) – находит только самый первый e-mail и дальше не ищет. Также в этом алгоритме нет проверки корректности e-mail. Но если ты, читатель, пишешь на C++ программы более сложные нежели «Hello World!» и знаешь что такое рекурсия, то тебе не составит труда усовершенствовать алгоритм до нужной кондиции ;-)

Метки: , , , , , , , , , , , ,

5 коммент. на “Парсим страницы, тащим e-mail”

  1. momkarla:

    Жуть))) В сети лежит дофигища готовых скриптов для парсинга емейлов, а вы за это еще какую-то плату мечтаете получить…

  2. bitonic:

    2momkarla

    Жуть? А по мне так очень даже неплохо. Искал по просторам инета исходники ну хоть какой-нибудь рабочей программки на С++ , которая бы парсила страницы на предмет присутствия e-mail – нет таких (кроме исходников MyDoom:-) ). Хотя, может быть и есть где-то, но дальше 3-ей страницы поиска Гугла лень идти :) А то, что есть куча скриптов для парсинга – я согласен. Но ведь мне нужен был исходник на С++, а не скрипт!

    Заметил одну особенность программисты на С++ не спешат делиться своими исходниками, а программисты на скриптовых языках делятся своими скриптами легко и непринужденно. Почему? Потому что программеры-скриптовики НЕ ЦЕНЯТ свой труд, а СиПлюПлюсники ЦЕНЯТ. Времена халявы проходят. То есть, я могу бесплатно поделиться мыслью, но полноценная реализация – только за деньги $:-)

    Теперь по-поводу того, что я «мечтаю получить». Я не мечтаю получить ничего с этого исходника. А упоминание о деньгах было сделано специально, чтобы отпугнуть любителей безразмерной халявы;-) Этот блог создавался не для заработка (по крайней мере в ближайшем будущем). То что я пишу в этом блоге это – опыт (не обязательно программерский),мысли, немного алгоритмов с минимальными исходниками. Если кому-то это пригодится, то буду рад. Ну а если кому-то не нравится, то я никого силками не держу – «проходите мимо» :)

  3. mr.codec:

    Вот так дела. Встретить знакомый ник совершенно случайно.. momkarla привед)

  4. momkarla:

    bitonic, ясно) Я раньше тоже программировала на С++, потом на С++Builder-е, но после смены работы занялась Делфями)

    mr.codec, привет))

  5. bitonic:

    Я так посмотрю тУсОвКа растет :)

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