Помогите спарсить

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ex3me, 9 Sep 2009.

  1. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Тренируюсь на делфи писать спамеры по ПМ во всяких онлайн-играх. Возникла проблема с парсингом списка юзеров.

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

    HTML:
    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)

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

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Делфи не знаю, попытался переделать с си++ билдера

    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 получишь список всех юзеров
     
    #2 Meecript_, 9 Sep 2009
    Last edited: 9 Sep 2009
  3. Dosia

    Dosia Member

    Joined:
    5 Jun 2009
    Messages:
    118
    Likes Received:
    81
    Reputations:
    6
    Я, как настоящий ламер ( потому что я тоже не силен в регулярках), написал бы что - то вроде этой процедуры:

    Code:
    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;
    
    Результат работы:

    Code:
    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
    ну и тд =)...
    
     
    #3 Dosia, 9 Sep 2009
    Last edited: 9 Sep 2009
    1 person likes this.
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    939
    Likes Received:
    162
    Reputations:
    27
    По моему вариант от Dosia оптимальный. С регулярками не советую работать, - процедура, как и сама программа, будет выполняется медленнее.
     
  5. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,390
    Likes Received:
    1,209
    Reputations:
    475
    Chrome~
    ну конечно, регулярки вообще какой то идиот придумал, настоящие трукодеры прогоняют массив процедурами и в каждой интерации цикла убирают ненужный текст. Садись два
     
  6. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,093
    Likes Received:
    459
    Reputations:
    38
    Chrome~, не на много медленнее. почти не заметно.
    Spyder, я писал бекдор - делал примерно как Dosia, ибо регулярки больше 100 кб кода занимают. так что всё зависит от конкретного случая.
     
    #6 mr.The, 9 Sep 2009
    Last edited: 9 Sep 2009
    1 person likes this.
  7. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    939
    Likes Received:
    162
    Reputations:
    27
    Ты прям отличник получается?
    Что бы применить регулярные выражения в Delphi нужно подключать модуль TRegExpr, благодаря которому сильно увеличивается размер программы. Я не особо работал в PHP и вообще не работал в Perl, но раз многие используют регулярки в этих языках, - у меня нет ничего против. Но регулярки в Delphi немного... неправильно. Помню, что на официальном сайте компонента было написано, что софт, который использует TRegExpr должен быть бесплатным. И все таки, подключать столь большую библиотеку ради этого дела наверное не стоит.
     
  8. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    289
    Reputations:
    43
    читаем 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/
     
    2 people like this.
  9. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    939
    Likes Received:
    162
    Reputations:
    27
    Честно говоря, не знал об этом, спасибо тебе, обязательно почитаю.

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

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,093
    Likes Received:
    459
    Reputations:
    38
    0_о однако. незнаю, я писал на с++, и там единственным вариантом было убрать это в длл. так как мне это всё-равно не подходило, я решил поизвращаться.
     
Loading...