TWebBrowser - interpretacja javascript w kodzie HTML

Odpowiedz Nowy wątek
2013-05-04 17:19

Rejestracja: 16 lat temu

Ostatnio: 3 tygodnie temu

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)?


edytowany 7x, ostatnio: bronex, 2013-05-04 17:31
Takie rzeczy to tylko w Erze. A tak poważnie to w Usera @kAzek tutaj wierzę :) - olesio 2013-05-04 17:38

Pozostało 580 znaków

2013-05-04 18:22

Rejestracja: 14 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Gorlice

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?


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2013-05-04 19:23

Rejestracja: 16 lat temu

Ostatnio: 3 tygodnie temu

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 ;)


edytowany 2x, ostatnio: bronex, 2013-05-04 19:26

Pozostało 580 znaków

2013-05-04 19:32

Rejestracja: 14 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Gorlice

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ę.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2013-05-04 19:32

Pozostało 580 znaków

2013-05-04 20:34

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

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;

Pozostało 580 znaków

Odpowiedz

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