2011-01-06 11 views
0

Ich arbeite an einem Stück Code, in dem ich alle Links von einer bestimmten Webseite extrahieren muss. Ich benutze die Komponente EmbeddedWB, weil ich auch die aktuelle Seite anzeigen muss. Ich habe eine einfache Seite, die in den EmbeddedWB geladen wird und einige Skripte enthält, die einige URLs mit der Funktion "document.write" von JavaScript erzeugen. Ich habe so etwas wie dies theoretisch:JavaScript-generierte Links in Delphi extrahieren

<html> 
<body> 
<a href=#>No problem Here<a/> 
<script Language="JavaScript"> 
var random=Math.floor(Math.random()*11); 
document.write("<a href=\"index"+random+".html\"> I Can’t catch this link! </a>"); 
</script> 
</body> 
</html> 

durch die Funktion ViewPageLinksToStrings mit (LinksList: TStrings) der Komponente I wie erhalten die URL erwartet im Quellcode gefunden, aber meine Absicht ist, die Links zu fangen, dass werden auch mit JavaScript generiert.

Was wäre der beste Weg, dies zu tun? Gibt es eine Bibliothek, die ich benutzen kann?

Vielen Dank für Ihre Zeit. John Marko

+1

Verschiedene Web-Browser können „show Seite Quelle“ anders in dieser Hinsicht. Ich vergesse, welcher bestimmte Browser, aber ich erinnere mich an mindestens einen, der Ihnen die "letzte" Quelle zeigt, d. H. Was das Javascript ausstrahlte, anstatt die js selbst. Das Einbetten eines solchen Browsers kann Ihnen dabei helfen ... Alternativ dazu, wie Sie das DOM durchgehen, um Links zu finden? Das DOM muss alle Links enthalten, einschließlich derjenigen, die von JS generiert wurden. –

Antwort

1

Es sieht aus wie EmbeddedWB unterstützt Javascript und ich fand this article im Forum. I enthält Code, der die vollständige (Javascript generiert) DOM-Baum in eine Variable vom Typ IHTMLDocument2 liest, die hier vereinfacht:

procedure MyProcedure(Sender: TObject); 
var 
    Doc: IHTMLDocument2; 
begin 
    EmbeddedWB1.Navigate('... some url ...'); 
    while EmbeddedWB1.ReadyState < READYSTATE_INTERACTIVE do 
    Application.ProcessMessages; 

    Doc := EmbeddedWB1.Document as IHTMLDocument2; 
    ...