dj napisał(a)
To jak pobrać wtronę www zapewne wiesz jak zrobić.
Załóżmy że posiadasz hipotetyczną klasę TSimpleHtmlParser do której jako źródło podłączasz strumień z pobraną stroną.
TSimpleHtmlParser nie robi nic szczególnego po prostu czyta kolejny znacznik html przetwarzając argumenty (dzięki temu możesz łatwo modyfikować wartości argumentów) a jeżeli natrafi na tekst to zwraca go nie przetwarzając kolejnego znacznika.
W ten sposób masz sekwencyjny dostęp do źródła HTML:
jeżeli natrafisz na znacznika html'a to po prostu zapisujesz go wraz z argumentami na wyjście
natrafiając na tekst modyfukujesz go i wysyłasz zapisujesz na wyjście
Możesz oczywiście wykożystać jakieś gotowe parsery które tworzą z źródła strukturę DOM ale wydaje mi się że to niemotrzebnie utrudni zadanie a i nie wszystkie pliki html będą chciały się sparsować takim narzędziem.
Jeżeli chodzi o prosty parser to mógłby on wyglądać następująco
TSimpleHtmlParser = class
public
TagArgs: String;
TagName: String;
function GetToken: String;
property NotEof: Boolean;
property Source: TStream;
property ArgsCount: Integer;
property ArgName[Index: Integer]: String;
property ArgValue[Index: Integer]: String;
end;
oczyisie to pseudo kod ale podstawowa funkcjonalność pole TagName i TagArgs (argumenty znacznika) mówi jaki tag aktualnie został przetworzony przez GetToken. GetToken zwraca tekst pomiędzy znacznikami jeżeli tak owy jest. Reszty można się domyśleć.
Pozdrawiam
Dzięki za tak długą odpowiedz, ale albo ja jestem jakiś ograniczony albo czegoś nie napisałeś.
Mam takie kodziki do pokazywania źródła strony z WebBrowser:
uses ActiveX, MSHTML_TLB, SHDocVw_TLB,
ComCtrls, OleCtrls;
procedure TForm1.Button1Click(Sender: TObject);
var
HTMLDocument: IHTMLDocument2;
PersistFile: IPersistFile;
begin
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
PersistFile := HTMLDocument as IPersistFile;
PersistFile.Save(StringToOleStr('c:\SavedFile.html'), System.True);
end;
function GetHtml(WebBrowser : TWebBrowser) : string;
begin
Result:=WebBrowser.OleObject.Document.documentElement.innerHTML;
end;
RichEdit.Lines.Text := GetHtml(WebBrowser);
Załóżmy że w Memo1 już mam przerobiony kod.
I jak teraz chcę to załadować stronę żeby działała w pełni.(np. żeby linki dobrze się odwoływały, formularze sesje przetrwały itp.) I jak to zrobić?