Seiteninhalt von WebBrowser Control in Zwischenablage kopieren.

Der_Gerhard

Grünschnabel
Hi,

ich versuche zur Zeit, folgendes Problem zu lösen:
Mit Hilfe eines WebBrowser Controls will ich verschiedene Seiten der Reihe nach aufrufen und den Inhalt abspeichern. Allerdings will ich nicht den HTML-Quelltext, sondern das, was der IE nach Drücken von Ctrl-C in die Zwischenablage reinpackt.

Bisher habe ich das mit dem folgenden Code gemacht:

Code:
    SendKeys.SendWait("^a^c");
    String Inhalt = Clipboard.GetText();

Danach dann mit webBrowser.Navigate auf zur nächsten Seite.
Das klappt auch erstmal ganz gut.

Einige der Seiten brauchen zum Aufbau aber eine Weile und manchmal sind recht viele Seiten nacheinander aufzurufen.
Daher will ich das Programm nicht immer nur im Vordergrund laufen lassen, sondern mit anderen Programmen arbeiten können.
Hier versagt meine Lösung, weil dann dummerweise das Programm im Vordergrund anfängt, den eigenen Inhalt zu kopieren.
Mein Programm, das dahinter angezeigt wird, geht leer aus.

Kann mir jemand eine Lösung verraten, wie ich den IE in meinem Form dazu bringe, den Inhalt zu kopieren ohne bei der Tastaturemulation daneben zu zielen?

Vielen Dank schonmal
 
Grumml. Meine bisherige Lösung hat noch einen weiteren Fehler.
Auch wenn die Anwendung im Vordergrund ist und der Fokus im WebBrowser Control liegt, wird nicht immer der Inhalt in die Zwischenablage kopiert.
Welches Fenster dann das "^a^c" kriegt, weiß ich nicht.

Hat vielleicht jemand hierfür einen Rat, damit wenigstens diese Variante funktioniert?
 
Hallo,

hmm zu deinem ersten Post weiß ich da auch nichts, hab da gestern schon gesucht, ob das WebBrowser-Control ein Copy oder so hat, ich such jetzt auch mal in dem AxWebBrowser, ob das sowas zur Verfügung stellt.

Aber zu deinem zweiten Post: jedes Control hat die Methode Focus(), damit setzt du den Eingabefokus auf das Control!
Edit: Auch der AxWebBrowser hat keine Copy-Funktion..

MfG
Fabsch
 
Zuletzt bearbeitet:
Danke, ich werde das einmal ausprobieren.
Allerdings weiß ich nicht, was es bringen soll. Ich habe ja gar nicht in irgendein anderes Fenster geklickt, um den Fokus wegzunehmen.
Er müsste also noch genau da sein, wo das Copy ausgeführt werden soll.

Edit:
Im Fehlerfall ist webBrowser.Focused auf true und der Aufruf webBrowser.Focus() vor jedem Kopierversuch bringt keine Verbesserung. Der vorherige Inhalt der Zwischenablage bleibt erhalten und wird anschließend erneut ausgewertet an Stelle des neuen Inhalts.

Ratlose Grüße
Gerhard
 
Zuletzt bearbeitet:
Was hast du denn mit dem Text genau weiter vor?

Ev. reicht es ja wenn man den HTML Text runterlädt und dann einfach alle HTML Tags entfernt :confused:
Oder aber noch einen kleinen Parser baun der einzelne Tags (vorausgesetzt keine Kiddys Seiten, sonst wird schwerer :D ) mit ihrer RTF Syntax ersetzt oder so :rolleyes:
 
Ziel der ganzen Sache ist es, Daten von bestimmten Seiten einer Website zu kopieren und in ein Tool einzutragen.
Bisher funktioniert das von Hand: Man kopiert im Browser die Seite und fügt dann den reinen Text ohne Formatierungen, Tabellen und sonstigen Balast in das Eingabefeld des Tools ein.
Manchmal sind dabei recht viele Seiten nacheinander zu kopieren.

Der Besitzer der Site hat nichts gegen dieses Kopieren, will aber nicht extra Funktionen einbauen um die Daten anders bereitzustellen.

Um dies etwas zu erleichten war nun meine Idee, für diese Aktion ein Progrämmlein zu basteln, das einen WebBroswer enthält. Mit dem kann man (fast) ganz normal auf der Site umhersurfen.
Sobald die Anzeige einer der auszuwertenden Seiten erkannt wird (an den Quelltext komme ich ja problemlos heran), soll diese kopiert und gespeichert werden. Wenn man alles erledigt hat, können die gesammelten Daten in einem Rutsch ausgewertet werden.
Ich will dabei nicht den HTML-Quelltext protokollieren, sondern nur genau das, was auch manuell kopiert wird. Daher müsste der Browser die Konvertierung von HTML nach Text-Only erledigen.

Den HTML-Parser wollte ich mir eigentlich sparen, wenn ich schon einen kompletten Browser habe. Immerhin sind ja alle nötigen Funktionen vorhanden.

Und SendKeys muss doch zu irgendwas zu gebrauchen sein. Aber wenn man nicht auf die richtige Anwendung "zielen" kann, oder jemand den Fokus klauen kann, weiß ich gar nicht, wozu die Funktion eigentlich gut sein soll.

Viele Grüße
Gerhard
 
ok hier mal ungetesteter Code für einen eigenen HTML Parser

Website downloaden:
C#:
System.Net.WebClient wc = new System.Net.WebClient();
wc.DownloadFile(meineUrl, fileName);

Alles innerhalb des Body Tags ermitteln:
C#:
private string GetBodyText(string downloadedFile)
{
  string seite=string.Empty;
  using(StreamReader sr=new StreamReader(downloadedFile, Encoding.Default))
    seite=sr.ReadToEnd();

  Match m=Regex.Match(seite, "< *body *[^<>]*>(?'innerText'.*)< */ *body *>",   RegexOptions.Singleline | RegexOptions.IgnoreCase); 
  if(m.Groups["innerText"].Success)
     return m.Groups["innerText"].Value;  //liefert alles innerhalb des Bodytextes
  else
    return string.Empty;
}

Tags entfernen:
C#:
private string RemoveTags(string bodyText)
{
   return Regex.Replace(bodyText, "<[^<>]*>", "", RegexOptions.Singleline);
}

völlig ungetestet aber vielleicht funktionierts ja und löst deine Probleme

Edit:
Funktion RemoveTags war denke ich bissel zu ungenau.
Habs angepasst.
 
Zuletzt bearbeitet von einem Moderator:
Danke für den Vorschlag.

Es wird so sicher nicht funktionieren, weil damit die Trennzeichen zwischen Tabellen Feldern nicht so wie im Browser entstehen, aber das krieg ich schon noch irgendwie hin.
 
Zuletzt bearbeitet:
Oh mein Gott! Es ist so einfach. ;-)

Code:
webBrowser1.Document.Body.InnerText
liefert ziemlich genau das, was ich haben möchte.
 
Zurück