AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi EmbeddedWB "angezeigten" Text kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

EmbeddedWB "angezeigten" Text kopieren

Ein Thema von Relicted · begonnen am 5. Dez 2008 · letzter Beitrag vom 4. Jan 2012
Antwort Antwort
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#1

EmbeddedWB "angezeigten" Text kopieren

  Alt 5. Dez 2008, 10:35
Moin,

habe folgendes Problemchen: Ich würde gerne die Webseite, welche angezeigt wird im EmbeddedWB ohne den HTML Klumpatsch also rein den Text der sich auf dieser Seite befindet kopieren.
Finds etwas schwer zu umschreiben. Also Ihr geht auf eine Internetseite, drückt Strg+A und danach Strg+C. Ihr habt also rein ASCII in der Zwischenablage. Und genau diesen Inhalt hätte ich gerne nur ohne den Umweg über die Zwischenablage bzw. über Sendkeys oder ähnliches. Jemand eine Idee?

Edit: DocumentSourceText wäre fast das was ich suche, jedoch verschluckt der Tabs und Leerzeichen etc.

Gruß
Reli
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: EmbeddedWB "angezeigten" Text kopieren

  Alt 5. Dez 2008, 10:45
Hallo

In meinem Mini Webbrowser Demo habe ich es mal so gemacht:

Delphi-Quellcode:
procedure WB_GetDocumentSourceToStream(Document: IDispatch; Stream: TStream);
// Save a TWebbrowser Document to a Stream
var
  PersistStreamInit: IPersistStreamInit;
  StreamAdapter: IStream;
begin
  Assert(Assigned(Document));
  Stream.Size := 0;
  Stream.Position := 0;
  if Document.QueryInterface(IPersistStreamInit,
    PersistStreamInit) = S_OK then
  begin
    StreamAdapter := TStreamAdapter.Create(Stream, soReference);
    PersistStreamInit.Save(StreamAdapter, False);
    StreamAdapter := nil;
  end;
end;

function WB_GetDocumentSourceToString(Document: IDispatch): string;
// Save a Webbrowser Document to a string
var
  Stream: TStringStream;
begin
  Result := '';
  Stream := TStringStream.Create('');
  try
    WB_GetDocumentSourceToStream(Document, Stream);
    Result := StringReplace(Stream.Datastring, #$A#9, #$D#$A, [rfReplaceAll]);
    Result := StringReplace(Result, #$A, #$D#$A, [rfReplaceAll]);
  finally
    Stream.Free;
  end;
end;


function WB_GetPlainText(WB: TWebbrowser; s: TStrings): string;
var
  IDoc: IHTMLDocument2;
  Strl: TStringList;
  sHTMLFile: string;
  v: Variant;
begin
  sHTMLFile := WB_GetDocumentSourceToString(WB.Document);
  Strl := TStringList.Create;
  try
    Strl.Add(sHTMLFile);
    Idoc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
    try
      IDoc.designMode := 'on';
      while IDoc.readyState <> 'completedo Application.ProcessMessages;
      v := VarArrayCreate([0, 0], VarVariant);
      v[0] := Strl.Text;
      IDoc.write(PSafeArray(System.TVarData(v).VArray));
      IDoc.designMode := 'off';
      while IDoc.readyState <> 'completedo Application.ProcessMessages;
      s.Text := IDoc.body.innerText;
    finally
      IDoc := nil;
    end;
  finally
    Strl.Free;
  end;
end;


Ohne Webbrowser (mit und Indy TidHTTP) könntest du es so machen:

Delphi-Quellcode:
uses
  MSHTML, ActiveX, ComObj;

procedure WB_GetPlainText(AURL: string): string;
var
  IDoc: IHTMLDocument2;
  Strl: TStringList;
  v: Variant;
  i: Integer;
begin
  Result := '';
  Strl := TStringList.Create;
  try
    Strl.Text := idHTTP1.Get(AURL);
    Idoc := CreateComObject(Class_HTMLDocument) as IHTMLDocument2;
    try
      IDoc.designMode := 'on';
      while IDoc.readyState <> 'completedo
        Application.ProcessMessages;
      v := VarArrayCreate([0, 0], VarVariant);
      v[0] := Strl.Text;
      IDoc.write(PSafeArray(System.TVarData(v).VArray));
      IDoc.designMode := 'off';
      while IDoc.readyState <> 'completedo
        Application.ProcessMessages;
      Result := IDoc.body.innerText;
    finally
      IDoc := nil;
    end;
  finally
    Strl.Free;
  end;
end;
Thomas
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: EmbeddedWB "angezeigten" Text kopieren

  Alt 5. Dez 2008, 11:07
Danke für den Quelltext, leider spuckt er genau das gleiche Ergebnis aus wie "DocumentSourceText" des EmbeddedWB.

Hier mal nen paar mehr Infos...

Quelltext:

Code:
<table>
        <TR>
        <TD>Name:</TD>
        <TD>Test</TD>
        </TR>
</table>
Heraus kommt (Copy&Paste-ich hoffe man sieht das Tab&Leerzeichen):
Code:
Name:    Test
Edit: der Tab scheint in der Anzeige aufgelöst zu werden in Leerzeichen. Es ist eigentlich "Name:_TABTest"

Und aus deiner Funktion und der o.g. Funktion des EmbeddedWB kommt heraus:
Code:
Name:Test
Gruß
reli
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: EmbeddedWB "angezeigten" Text kopieren

  Alt 12. Dez 2008, 07:03
Hast du schon eine Lösung gefunden?
Thomas
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: EmbeddedWB "angezeigten" Text kopieren

  Alt 12. Dez 2008, 07:28
Moin,

jain Keine schöne zumindest. Ich parse jetzt das HTML und baue mir das Ergebnis so zusammen wie ich es brauche. Nicht schön aber funktioniert

Gruß
Reli
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: EmbeddedWB "angezeigten" Text kopieren

  Alt 3. Jan 2012, 16:10
Warum werden in der folgenden Funktion #$A#9 und #$A durch einen Zeilenumbruch ersetzt? Wenn ich den Code ausführe, hat er schon von Haus aus richtige Zeilenumbrüchem. Mit dem nachfolgendem Code verdoppeln sich bei jeder Ausführung und anschließender rückspeicherung die Zeilenumbrüche, da #$A zweil mal ersetzt wird. Diesen Code findet man öfter im WWW. Wo ist der Sinn? Ein Fehler? Oder muss da irgendwas vom IE gefixt werden?

Delphi-Quellcode:
function WB_GetDocumentSourceToString(Document: IDispatch): string;
// Save a Webbrowser Document to a string
var
  Stream: TStringStream;
begin
  Result := '';
  Stream := TStringStream.Create('');
  try
    WB_GetDocumentSourceToStream(Document, Stream);
    Result := StringReplace(Stream.Datastring, #$A#9, #$D#$A, [rfReplaceAll]); //<-- Sinn?
    Result := StringReplace(Result, #$A, #$D#$A, [rfReplaceAll]); //<-- Das verdoppelt den Zeilenumbruch
  finally
    Stream.Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#7

AW: EmbeddedWB "angezeigten" Text kopieren

  Alt 4. Jan 2012, 02:15
Weil viele Webseiten von einem Linux-Server ausgeliefert werden, bzw. oftmals der Output, vor dem Ausliefern auf die Linux-#10 "optimiert" wird. (weniger Bytes)

Und bei diesen Codes vergessen wurde, daß doch mal jemand auf die "blöde" Idee kommen könnte HTMLs in einem Windows-Format auszuliefern.


#$A#9 ist eigentlich ein Fehler, aber damit wollte man wohl verhindern, daß bei #13#10 ebenfalls ersetzt wird, was aber nur zutreffen würde, bei allen Zeilen, welche nachfolgend mit #9 anfangen und wenn man das Nachfolgende StringReplace weggelassen hätte.


Stattdessen entweder vorher schauen, ob #13#10 schon vorliegt und dann nichts machen,

oder einfach immer folgende Ersetzungen durchführen.
#13#10 -> #10, danach #13 -> #10 und zum Schluß #10 -> sLineBreak.

Man kann es auch ganz einfach mal schnell durch eine TStringList jagen, welche dann zum selben Ergebnis kommt, wie meine genannte Ersetungsreihenfolge.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: EmbeddedWB "angezeigten" Text kopieren

  Alt 4. Jan 2012, 11:47
Danke, himitsu!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz