TWebBrowser - interpretacja javascript w kodzie HTML

TWebBrowser - interpretacja javascript w kodzie HTML
bronex
  • Rejestracja:ponad 21 lat
  • Ostatnio:około rok
  • Lokalizacja:Kraków
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:

Kopiuj

  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

Kopiuj
 
<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

Kopiuj
<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
olesio
Takie rzeczy to tylko w Erze. A tak poważnie to w Usera @kAzek tutaj wierzę :)
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Gorlice
1

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

Kopiuj
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>
Kopiuj
<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.
bronex
  • Rejestracja:ponad 21 lat
  • Ostatnio:około rok
  • Lokalizacja:Kraków
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
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:4 minuty
  • 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

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

dodaję:

Kopiuj
<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
ER
  • Rejestracja:około 17 lat
  • Ostatnio:około 11 lat
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:

Kopiuj
 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ź:

Kopiuj
 
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;
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)