Компонент для парсинга HTML

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by xophet, 24 May 2011.

  1. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Посоветуйте (а лучше поделитесь) пожалуйста компонент для парсинга HTML на Delphi (freeware или крякнутый :) )
    Спасибо.
     
    #1 xophet, 24 May 2011
    Last edited: 24 May 2011
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А компонентом для закатывания губ не поделиться? Или ты думаешь что есть компоненты для всех случаев жизни и тебе ничего вообще делать не надо будет никогда а тупо тока кидать компоненты на форму?

    1) ручками парси. pos и copy еще не отменяли
    2) html - считай упрощенный аналог xml так что как вариант какойнить xml парсер сможет тебе помоч
    3) можно попробовать заюзать WebBrowser и через COM обращаться к элементам страницы.
    4) любой двиг регулярных выражений.
     
    2 people like this.
  3. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    на счет 3) пользуюсь IHTMLdocument2, но есть минусы, я пару раз вопросы по этому поводу поднимал, решить не смогли:
    1) на некоторых сайтах вылазит крит ошибка dll'ек
    2) на некоторых сайтах показывает "сообщение безопасности:сайт небезопасен", а если отключить всплывающие окна, то это сообщение пропадает, но начинают вылазить всплывающие окна)))

    Компоненты для парсинга находил, но они платные.
    Как вариант - написать самому, но к сожалению недостаточно знаю ООП чтобы написать хороший компонент, а писать г**но - только время зря тратить.
     
  4. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
  5. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    Используй функцию

    Code:
    function Pars(T_, ForS, _T: string): string;
    var
      a, b: integer;
    begin
      Result := '';
      if (T_ = '') or (ForS = '') or (_T = '') then
        Exit;
      a := Pos(T_, ForS);
      if a = 0 then
        Exit
      else
        a := a + Length(T_);
      ForS := Copy(ForS, a, Length(ForS) - a + 1);
      b := Pos(_T, ForS);
      if b > 0 then
        Result := Copy(ForS, 1, b - 1);
    end;
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Спасибо!! Буду разбираться.

    Можно, но не вариант. Надо более совершенный подход искать!
     
  7. kakeolala

    kakeolala Banned

    Joined:
    13 Jul 2010
    Messages:
    118
    Likes Received:
    2
    Reputations:
    0
    TRegExpr не катит ?
     
  8. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags
     
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    and Russian hackers pwn your webapp :D :D :D
    Chuck Norris can parse HTML with regex :D
     
    #9 xophet, 24 May 2011
    Last edited: 24 May 2011
  10. kakeolala

    kakeolala Banned

    Joined:
    13 Jul 2010
    Messages:
    118
    Likes Received:
    2
    Reputations:
    0
    Спасибо гуглу:
    Code:
    TSection = record
       Name, Value: String;
      end;
    
      TSectionArray = Array of TSection;
    
      TCustomParser = class
       fText: String;
       fSections: TSectionArray;
      private
       procedure SetText(const Value: String);
       function GetSectionCount: Integer;
      public
       property Text: String read fText write SetText;
       property Count: Integer read GetSectionCount;
       property Sections: TSectionArray read fSections write fSections;
       function GetSectionValue(Section: String): String;
      end;
    
    
    { TCustomParser }
    
    function TCustomParser.GetSectionCount: Integer;
    begin
     Result := Length(fSections);
    end;
    
    function TCustomParser.GetSectionValue(Section: String): String;
    Var i: Integer;
    begin
     for i := 0 to Length(fSections) - 1
     do if fSections[i].Name = Section
        then begin
             Result := fSections[i].Value;
             Break;
             end;
    end;
    
    procedure TCustomParser.SetText(const Value: String);
    Var S: String;
    begin
     fText := Value;
     S := Value;
     SetLength(fSections, 0);
     while Pos('<', S) > 0
     do begin
        SetLength(fSections, Length(fSections) + 1);
        Delete(S, 1, Pos('<', S));
        fSections[High(fSections)].Name := Copy(S, 1, Pos('>', S) - 1);
        Delete(S, 1, Pos('>', S));
        fSections[High(fSections)].Value := Copy(S, 1, Pos('</', S) - 1);
        Delete(S, 1, Pos('>', S));
        end;
    end;
    
     
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Какеола, ты конечно прости, но то что тебе выдал гугл - вообще НИ_О_ЧЕМ.
    Ты сам-то хоть код смотрел?
    Это тупо стринглист вида
    Name1=Value1;
    Name2=Value2;
    Name3=Value3;
    И где тут упоминается вообще HTML?
    А где, скажи на милость обращение к свойсву тега по имени свойства, что-то типа
    <table align="left" border="0" width="100%" cellspacing="0" cellpadding="0">
    и я хочу узнать align, как мне при помощи твоего класса это сделать?
    И как это вообще использовать то? :)
    Скорее всего это кусок какого-то парсера, но далеко не весь...
     
    #11 xophet, 24 May 2011
    Last edited: 24 May 2011