PDA

Просмотр полной версии : Помогите спарсить


ex3me
09.09.2009, 17:12
Тренируюсь на делфи писать спамеры по ПМ во всяких онлайн-играх. Возникла проблема с парсингом списка юзеров.

Собственно после idHTTP.GET страницы получаю кусок исходного кода страницы, который необходимо "разобрать"

class=header><b><a href=/tournaments/1021707>Премьер-лига: Кубок Друзей-11867</a> // 09.09.2009 09:50</td><tr bgcolor=white><td valign=top height=50px width=100%><li> <b>Призовой фонд:</b> 8.800<br><li> <b>Длительность:</b> до 120 минут<li> <b>Уровень игрока:</b> 2<li> <b>Опыт футболистам:</b> 200%<li> <b>Участники:</b><div style='text-color:#808080;'><img src=http://img.11x11.ru/images/vip/1.gif title=VIP-1 border=0 align=absmiddle> <a href=/users/1162508>Studio Neopixel</a> [2], <img src=http://img.11x11.ru/images/vip/1.gif title=VIP-1 border=0 align=absmiddle> <a href=/users/1024340>Манкунианцы</a> [2], <a href=/users/1111091>Team 2000</a> [2], <a href=/users/1131952>Sanyamba OiOiOi</a> [2], <a href=/users/1091744>Nell</a> [2], <a href=/users/1144478>kama2007</a> [2], <a href=/users/649301>kostyajuve</a> [2], <a href=/users/1167982>НОЛА</a> [2], <a href=/users/1079793>goshak</a> [2], <a href=/users/1134896>Шахтар Конотоп</a> [2], <a href=/users/1153154>FC Chita1978</a> [2], <a href=/users/1142245>masterdj</a> [2], <a href=/users/1074376>oukb34rus</a> [1], <a href=/users/1146091>Olegan059</a> [2], <a href=/users/1160340>Ramzay</a> [2], <a href=/users/1104367>franc87</a> [2], <a href=/users/1146681>revun</a> [2], <a href=/users/1150390>Ace me</a> [2], <a href=/users/1106890>NEXSUS007</a> [2], <a href=/users/867456>агро</a> [2], <a href=/users/1092127>Goal4win</a> [2], <a href=/users/569525>Palivo</a> [2], <a href=/users/1050513>DarkSithh</a> [2], <a href=/users/1159356>Big Pussy</a> [2], <a href=/users/1146657>Головастик</a> [2], <a href=/users/1162559>ФК_Захаров</a> [2], <a href=/users/1150710>Campeone</a> [2], <a href=/users/1164571>ser_vydy</a> [2], <a href=/users/737445>lukin</a> [2], <a href=/users/1158351>300_спартанцев</a> [2], <a href=/users/1121495>Elvis</a> [2], <a href=/users/1116768>Tezaur</a> [2], <a href=/users/699626>Kostik</a> [2], <a href=/users/1119587>FC Min-Vodi</a> [2], <a href=/users/964257>Honda</a> [2], <a href=/users/1123827>ilya_063</a> [2], <a href=/users/1164206>Carlos Digolas</a> [2], <a href=/users/1162052>FK_КУБАНЬ</a> [2], <a href=/users/865315>rHuga</a> [2], <a href=/users/691581>-AMKAP</a> [2], <a href=/users/1157737>UDAV</a> [2], <a href=/users/1083712>кривоногие мастера</a> [2], <a href=/users/1133280>gorokhov</a> [2], <a href=/users/1142904>Kireevsk</a> [2], <a href=/users/831618>AstaxOFF</a> [2], <a href=/users/1148913>NomadSTI</a> [2], <a href=/users/1169494>syava205</a> [2], <a href=/users/1125857>Fonakkz</a> [2], <a href=/users/1092961>ADor</a> [2], <a href=/users/1084072>Veliton Team</a> [2], <a href=/users/1034049>Paulo Maldini</a> [2], <a href=/users/1120628>Hesus77</a> [2], <a href=/users/1092822>robocop</a> [2], <a href=/users/1104672>ЛФК Эконом</a> [2], <a href=/users/1157637>serwer3000</a> [2], <a href=/users/1162500>vbctdbx</a> [2], <a href=/users/385760>УГНТУ</a> [2], <a href=/users/1168933>Italia-Juventus</a> [2], <a href=/users/1158407>Тутанхамон15</a> [2], <a href=/users/1164181>AlexUstaZZ</a> [2], <a href=/users/1156742>DINAMO BATUMI</a> [2], <a href=/users/1112183>Юрбанбанан</a> [2], <a href=/users/943444>Bingo1</a> [2], <a href=/users/1041527>ZYMA</a> [2]</div>

Процедура получения исходника страницы происходит элементарно: memo1.text := idhttp.get()

А получить мне надо только имя пользователя (для примера - <a href=/users/1146681>revun</a>, надо получить revun)

В "регулярках" и прочих хитростях не силен.
Помогите, кто чем горазд =)

M_script_
09.09.2009, 18:07
Делфи не знаю, попытался переделать с си++ билдера

stroka:AnsiString;
user:AnsiString;
stroka := idhttp.get();

while(stroka.Pos("<a href=/users/"))
begin
stroka.Delete(1, stroka.Pos("<a href=/users/"));
stroka.Delete(1, stroka.Pos(">"));
memo1.clear();
memo1.lines.add(stroka.SubString(1, stroka.Pos("<") - 1));
end;

в мемо1 получишь список всех юзеров

Dosia
09.09.2009, 18:08
Я, как настоящий ламер ( потому что я тоже не силен в регулярках), написал бы что - то вроде этой процедуры:


procedure TForm1.Button1Click(Sender: TObject);
var
strText:string;
begin
strText:=memo1.text;
memo1.Text := '';
while pos('<a href=/users/',strText) <> 0 do begin
delete(strText,1,pos('<a href=/users/',strText));
memo1.Text := memo1.Text + copy(strText,pos('>',strText)+1,pos('<',strText)-pos('>',strText)-1)+#13#10;
end;
end;


Результат работы:

Studio
Neopixel
Манкунианцы
Sanyamba
OiOiOi
Nell
НОЛА
goshak
Шахтар
Конотоп
FC Chita1978
oukb34rus
Olegan059
franc87
revun
Ace
me
NEXSUS007
Goal4win
Palivo
DarkSithh
Big Pussy
lukin
Tezaur
FC Min-Vodi
Honda
Carlos
Digolas
ну и тд =)...

Chrome~
09.09.2009, 20:09
По моему вариант от Dosia оптимальный. С регулярками не советую работать, - процедура, как и сама программа, будет выполняется медленнее.

Spyder
09.09.2009, 21:07
Chrome~
ну конечно, регулярки вообще какой то идиот придумал, настоящие трукодеры прогоняют массив процедурами и в каждой интерации цикла убирают ненужный текст. Садись два

mr.The
09.09.2009, 22:00
Chrome~, не на много медленнее. почти не заметно.
Spyder, я писал бекдор - делал примерно как Dosia, ибо регулярки больше 100 кб кода занимают. так что всё зависит от конкретного случая.

Chrome~
09.09.2009, 23:06
Chrome~
ну конечно, регулярки вообще какой то идиот придумал, настоящие трукодеры прогоняют массив процедурами и в каждой интерации цикла убирают ненужный текст. Садись два
Ты прям отличник получается?
Что бы применить регулярные выражения в Delphi нужно подключать модуль TRegExpr, благодаря которому сильно увеличивается размер программы. Я не особо работал в PHP и вообще не работал в Perl, но раз многие используют регулярки в этих языках, - у меня нет ничего против. Но регулярки в Delphi немного... неправильно. Помню, что на официальном сайте компонента было написано, что софт, который использует TRegExpr должен быть бесплатным. И все таки, подключать столь большую библиотеку ради этого дела наверное не стоит.

W!z@rD
10.09.2009, 07:28
Что бы применить регулярные выражения в Delphi нужно подключать модуль TRegExpr
читаем http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1062

и делаем выводы =\
хром завтра на ачат без родителей не приходи

mr.The касательно скорости, не знаю как в TRegExpr, но Regex (класс в .NET) позволяет собирать регулярку с ключем Compiled. Единожды она компилится и все. Увеличение производительности 10-15%. В твоем случае регулярка больше 100 строк кода? о_О
эммм.. ты чего парсил?))))

Compiled - http://habrahabr.ru/blogs/net/50413/

Chrome~
10.09.2009, 17:02
читаем http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1062
Честно говоря, не знал об этом, спасибо тебе, обязательно почитаю.

===
Если еще раз перечитать наш разговор, можно заметить, что античат, - это та же школа. Один раздает двойки, другой вызывает родителей...

mr.The
10.09.2009, 21:58
mr.The касательно скорости, не знаю как в TRegExpr, но Regex (класс в .NET) позволяет собирать регулярку с ключем Compiled. Единожды она компилится и все. Увеличение производительности 10-15%. В твоем случае регулярка больше 100 строк кода? о_О
эммм.. ты чего парсил?))))
0_о однако. незнаю, я писал на с++, и там единственным вариантом было убрать это в длл. так как мне это всё-равно не подходило, я решил поизвращаться.