[Delphi]pobranie, edycja i wyswietlenie strony www

0

Witam

Mam komponent WebBrowser otwieram w nim jakąś stronę www z internetu. I jak zrobić żeby przed wyświetleniem trochę z edytować źródło tej strony np. zamienić wyrazy polskie na angielski. Chodzi mi o samą metodę edycji tak, żeby strona nadal poprawnie działała(linki, formularze i wszystko inne)

Pozdrawiam

0

Jakiś prosty parser HTML (nie zalecał bym czegoś bardzo skomplikowanego) czytasz z jednego strumienia i zapisujesz do drugiego. Jeżeli natrafisz na coś co chciał byś zmodyfikować to modyfikujesz i zapisujesz wynik do drugiego strumienia. Następnie utworzony w ten sposób trumień ładujesz gdzie tam chcesz i renderujesz, ja tu dużej filozowi nie widzę.

Jeżeli chodzi o mnie to ja raczej nie podsunę jakiegoś gotowca :)

Pozdrawiam

0
dj napisał(a)

czytasz z jednego strumienia i zapisujesz do drugiego.

Jak to wykonać? Co do reszty to myślę że wiem jak.

0

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

0
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ć?

1 użytkowników online, w tym zalogowanych: 0, gości: 1