Сразу скажу, что эта статейка для программистов на 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!» и знаешь что такое рекурсия, то тебе не составит труда усовершенствовать алгоритм до нужной кондиции
Метки: Boost, C++, Алгоритм, Hello World!, iostream, PCRE, size_type, stdio.h, STL, string::npos, Td1, using namespace std, windows.h
Ноябрь 25, 2008 в 9:14 дп |
Жуть))) В сети лежит дофигища готовых скриптов для парсинга емейлов, а вы за это еще какую-то плату мечтаете получить…
Ноябрь 25, 2008 в 10:33 дп |
2momkarla
Жуть? А по мне так очень даже неплохо. Искал по просторам инета исходники ну хоть какой-нибудь рабочей программки на С++ , которая бы парсила страницы на предмет присутствия e-mail – нет таких (кроме исходников MyDoom:-) ). Хотя, может быть и есть где-то, но дальше 3-ей страницы поиска Гугла лень идти
А то, что есть куча скриптов для парсинга – я согласен. Но ведь мне нужен был исходник на С++, а не скрипт!
Заметил одну особенность программисты на С++ не спешат делиться своими исходниками, а программисты на скриптовых языках делятся своими скриптами легко и непринужденно. Почему? Потому что программеры-скриптовики НЕ ЦЕНЯТ свой труд, а СиПлюПлюсники ЦЕНЯТ. Времена халявы проходят. То есть, я могу бесплатно поделиться мыслью, но полноценная реализация – только за деньги $:-)
Теперь по-поводу того, что я «мечтаю получить». Я не мечтаю получить ничего с этого исходника. А упоминание о деньгах было сделано специально, чтобы отпугнуть любителей безразмерной халявы;-) Этот блог создавался не для заработка (по крайней мере в ближайшем будущем). То что я пишу в этом блоге это – опыт (не обязательно программерский),мысли, немного алгоритмов с минимальными исходниками. Если кому-то это пригодится, то буду рад. Ну а если кому-то не нравится, то я никого силками не держу – «проходите мимо»
Ноябрь 25, 2008 в 11:36 дп |
Вот так дела. Встретить знакомый ник совершенно случайно.. momkarla привед)
Ноябрь 26, 2008 в 2:00 пп |
bitonic, ясно) Я раньше тоже программировала на С++, потом на С++Builder-е, но после смены работы занялась Делфями)
mr.codec, привет))
Ноябрь 26, 2008 в 2:18 пп |
Я так посмотрю тУсОвКа растет