TWebBrowser - interpretacja javascript w kodzie HTML

0

Pewnie i tak nikt mi nie pomoze, ale mimo wszsytko pisze ten temat, poniewaz od 2 dni szukam, googluje i kombinuje nie majac pojecia co moze byc zle. To sie po prostu filozofom nie snilo :)

Piszę program do obsługi tabel piłkarskich z serwisu fcstats.com.

Z Racji iz w stronie występuje javascript zamiast Indy czy Synapse zdecydowalem się na TWebBrowser

kod w Delphi:


  WB.Navigate('http://fcstats.com/table,premier-league-england,1,1.php');

    {poczekaj az zaladuje (onDocumentComplete)}
  while not zaladowany do
    Application.ProcessMessages;
  zaladowany := false; // To rowniez do onDocumentComplete
  sleep(5000); // na wszelki wypadek, aczkolwiek nie jest konieczne

  kodHTML := WB.OleObject.Document.documentElement.innerHTML; // zapisanie kodu html
  mDebug.Lines.Text := kodHTML; // wyswietlenie w Memo (kodHTML: String)
 

I teraz zaczyna się jazda bez trzymanki ktora filozofom sie śniła :D

w mDebug(memo) mam "zinterpretowany kod html". Przez slowo "zinterpretowany" mam na mysli iż wszelki kod w JavaScript zostal przetworzony do HTML.

Niestety w zmiennej kodHTML mam kod "niezinterpretowany", czyli to co bylo w javascript wyswietlane jest w formie: <script language=>....

Abyscie mnie lepiej zrozumieli opre to na przykladzie(oczywiscie wklejam fragmenty kodu, bo ktoby czytal to wszystko):

**1. **zmienna kodHTML

 
<SCRIPT type=text/javascript src="http://whos.amung.us/pingjs/?k=qfsqc6htg1s6&amp;t=Table%20-%20Premier%20League%20(England)%20-%20Football%20stats%20-%20Football%20tables&amp;c=s&amp;y=&amp;a=-1&amp;r=9651" async="async"></SCRIPT>

2. zawartosc mDebug.lines.text

<td class="teamName">
	<a href="club,statistics,liverpool,11.php">
	Liverpool							</a>
	</td>
	<td class="leftBorder">35</td>
	<td>14</td>
	<td>12</td>
	<td>9</td>
	<td>67</td>
	<td>42</td>
        <td class="leftBorder rightBorder darkBackground">54</td>
        <td class="leftBorder leftText">
        ...

Dodam jeszcze ciekawa rzecz. Podgladajac w debugerze zawartosc

  • kodHTML
  • mDebug.Lines.Text

Mam zawartosc "niezinterpretowana", czyli ta ktora dalem w przykladzie 1. To naprawde dziwne, chyba Bill Gates nawet nie jak to mozliwe :) Bo przeciez w zawartosci mDebug w skompilowanym programie mam piekny przetworzony kod HTML ktory podalem w przykladzie 2

Dziwne, prawda?

Jak wiec mieć zawartosc kodu ktora jest w przykladzie 2 (zinterpretowana)?

1

Nie wiem o co chodzi na tamtej stronie ale sprawdź funkcję:

uses ActiveX;

function GetBeforeJSSource(WB: TWebBrowser): string;
var
  strStream: TStringStream;
  adapter: IStream;
  browserStream: IPersistStreamInit;
begin
  result:='';
  strStream := TStringStream.Create('');
  try
  browserStream := WB.Document as IPersistStreamInit;
  if not assigned(browserStream) then exit;
  adapter := TStreamAdapter.Create(strStream,soReference);
  browserStream.Save(adapter,true);
  result:= strStream.DataString;
  finally
  strStream.Free();
  end;
end;

Testowałem na takim prostym kodzie HTML i wygląda że działa tak jak chcesz (porównaj źródło pobrane twoim sposobem a moją funkcją zwróć uwagę co jest w tagu

):</p>
<html>
<body>
<div id="test" ></div>
<script type="text/javascript">
document.getElementById('test').innerHTML = 'Witam!';
</script>
</body>
</html>

Tylko jednej rzeczy nie rozumiem skoro chcesz czyste źródło to po co pobierać je przez WebBrowser a nie właśnie z użyciem Synapse czy Indy?

0

No wlasnie zle mnie kAzek zrozumiales aczkolwiek doceniam Twoja pomoc ;)

Gdybym potrzebowal czystego zrodla z checia uzylbym Synapse. Mi jest potrzebne przetworzone zrodlo.

Dlatego zamiast GetBeforeJSSource przydaloby sie GetAfterJSSource

Z checia zeby nie zawracac Ci glowy przerobilbym sobie Twoj kod, aczkolwiek prawie go nie rozumiem (nie znam tych zmiennych i funkcji). Dlatego licze ze mi jeszcze z checia pomozesz, bo z tego co patrze na forum masz sporą wiedze na temat TWebBrowser ;)

1

Po wykonaniu JavaScript chyba dostajesz normalnie przynajmniej tak wynika z kodu który testowałem kod HTML pobrany moją funkcją wygląda jak wyżej a przez

kodHTML:=WB.OleObject.Document.documentElement.innerHTML

dodaję:

<HEAD></HEAD>
<BODY>
<DIV id=test>Witam!</DIV>
<SCRIPT type=text/javascript>
document.getElementById('test').innerHTML = 'Witam!';
</SCRIPT>
</BODY>

Jest "Witam!" miedzy divami czyli po wykonaniu JS. Napisz dokładniej co ma być w uzyskanym kodzie z tamtej strony to może coś wymyślę.

0

Zajrzałem do źródła strony i oba fragmenty kodu z punktów 1 i 2 znajdują się w tym kodzie. JavaScript wcale nie wypełnia tych tabel, są zapisane normalnie. Niemożliwe jest też, żeby kodHtml i mDebug.lines.text miały inną zawartość - wszakże w kodzie programu przypisujesz jedno drugiemu:

 mDebug.Lines.Text := kodHTML; // wyswietlenie w Memo (kodHTML: String)

Debuger pokazuje ucięty string, może stąd to nieporozumienie, zapisz kodHTML do pliku i będzie tam to samo co w mDebug.
Jeżeli zależy Ci na tabelach z punktu 2, to są dostępne i bez JS, sprawdź:

 
var
  FStream: TFileStream;
  IdHttp: TIdHttp;
begin
  FStream := TFileStream.Create('c:\kod.txt', fmCreate);
  IdHttp := TIdHttp.Create;
  try
    IdHttp.Get('http://fcstats.com/table,premier-league-england,1,1.php', FStream);
  finally
    IdHttp.Free;
    FStream.Free;
  end;

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