Jak pobrać dane ze strony WWW w TWebBrowser?

0

Na wstępie: Panów o wybujałym ego lub chcących je sobie podwatować proszę o nie udzielanie się w tym wątku.

Mam położony WebBrowser i zrobiony navigate do strony, która mnie interesuje. Strona jest w aspx. Po wybraniu dwóch opcji z ComboBox dostępnych na tej stronie pojawia się lista wyników (jeżeli będzie taka potrzeba podam konkretny adres).

Pytanie brzmi: Jak wyciągnąć listę tych wyników (które są defacto linkami do zasobów, które mnie interesują).

0

Korzystanie z webbrowser jest mało eleganckie - rozwiązanie twojego problemu TWebBrowser i przyjaciele)
możesz też skorzystać z komponentów INDY INDY
lub pakietu synapse Obsługa protokołu HTTP przy użyciu pakietu Synapse

Do wyłuskania małej ilości danych możesz używać funkcji typu Pos, Copy itp. lub w bardziej wyrafinowany sposób przepuścić przez jakiś parser i operować sobie np. na DOM - dla delphi polecił bym ten: http://htmlp.sourceforge.net/

0

Dzięki za konkretną odpowiedź. Sprawdzam właśnie parser, do którego podałeś link.

generalnei to nie musi być ani piękne, ani efektywne. Operacja jest jednorazowa, ale chcę ją sobie zautomatyzować, bo ręcznie się zaciukam - za dużo danych do przetworzenia.

0

Nie znam się na aspx, ale o ile wiem tylko JavaScript komplikuje sprawę komponentom takim jak Indy czy Synapse. Używanie TWebBrowser do strony bez javascriptu żeby tylko pobrać jakieś dane z treści to jak polowanie na muchy z użyciem armaty. Dlatego również polecam do tego Synapse. Po lekturze mojego artykułu do którego dostałeś link wszystko powinno być jasne, a w razie czego jest dokumentacja z przykładami. Natomiast do parsowania strony może się rownież przydać moduł do wyrażeń regularnych. Polecam ten dostępny na http://regexpstudio.com/TRegExpr/TRegExpr.html - do archiwum dołaczona jest dokumentacja wraz z przykładami.

0

Okej. Na razie mam dość materiałów.

Parser, do którego dostałem link generalnie robi robotę o tyle, że przerabia stronę na postać tekstową. są w niej podane linki przy interesujących mnie pozycjach, więc jest już od czego zacząć.

Tylko to krok pierwszy. Uzyskanie dostępu do stgron z danymi merytorycznymi - to znaczy linki, któe wyłuskałem, pozwalają mi dostać się do stron, gdzie sa tabelki. Teraz muszę zawartość tych tabelek wydłubać i zaaplikować do bazy danych.

Brakuje mi tylko fragmentu, który wyłuska dane z tabelek - dalej sobie poradzę.

EDIT: Kawałeczek kodu, który wyciąga linki na podstawie tWebBrowser działa perfekcyjnie. Jest tam odwołanie do: WebBrowser.OleObject.Document.Links.Item(a).href

Rozumiem, że obiekt Links reprezentuje wszystkie znaczniki <A>. Pytanie, czy jest gdzieś opisana ta klasa, która zawiera Document - może tam znajdę informacje na temat Table i jak pobrać interesujące mnie dane ?

0

Bardzo Wam dziękuję koledzy za naprowadzenie na cel. Udało mi się rozwiązać wszystkie problemy.

Dla potomnych:

Do wyciągnięcia danych z tabelki wystarczy prosty kod:

 
procedure TForm1.Button6Click(Sender: TObject);
var ovTable: OleVariant;
begin
    ovTable := WebBrowser1.OleObject.Document.all.tags('TABLE').item(0);
    memo1.Lines.Add(ovTable.Rows.Item(1).Cells.Item(0).innerText+': '+ovTable.Rows.Item(1).Cells.Item(1).innerText);
    memo1.Lines.Add(ovTable.Rows.Item(2).Cells.Item(0).innerText+': '+ovTable.Rows.Item(2).Cells.Item(1).innerText);
    memo1.Lines.Add(ovTable.Rows.Item(3).Cells.Item(0).innerText+': '+ovTable.Rows.Item(3).Cells.Item(1).innerText);
    memo1.Lines.Add(ovTable.Rows.Item(4).Cells.Item(0).innerText+': '+ovTable.Rows.Item(4).Cells.Item(1).innerText);
    memo1.Lines.Add(ovTable.Rows.Item(5).Cells.Item(0).innerText+': '+ovTable.Rows.Item(5).Cells.Item(1).innerText);
    memo1.Lines.Add(ovTable.Rows.Item(6).Cells.Item(0).innerText+': '+ovTable.Rows.Item(6).Cells.Item(1).innerText);
end;

oczywiście powyższe działa na sztywno, ale łątwo domyśleć się, że: all.tags('TABLE').item - reprezentuje numer tabelki na stronie liczoną od 0

ovTable.Rows.Item - oznacza kolejny wiersz (także numerowane sa od 0)

ovTable.Rows.Item(<jakiś>).Cells.Item - oznacza kolejną kolumnę w danym wierszu

w moim przypadku do wyciągnięcia danych wystarczyło odwołanie się do właściwości innerText, ale jeżeli wewnątrz danej komórki tabeli są inne obiekty - można się do nich odwołać poprzez obiekt 'all'.

Generalnie rozwiązanie znalazłem tutaj:
http://www.delphipages.com/forum/showthread.php?t=90937

1

Do wyciągnięcia danych z tabelki wystarczy prosty kod:

O forze słyszał? lol.
Jak już wstawiasz kod to mogłeś się pokusić o tak zaawansowaną konstrukcję jak for...

0

Nie mam zamiaru kontynuować z tobą tej bezsensownej konwersacji.

0
-123oho napisał(a)

O forze słyszał? lol.
Jak już wstawiasz kod to mogłeś się pokusić o tak zaawansowaną konstrukcję jak for...

toyman napisał(a)

Nie mam zamiaru kontynuować z tobą tej bezsensownej konwersacji.

No, jakby nie patrzyć to @-123oho ma rację (choć wypowiedź jak zwykle bulwersująca), bo do tego właśnie służą pętle:

procedure TForm1.Button6Click(Sender: TObject);
var
  ovTable: OleVariant;
  sLine: String;
  I: Byte;
begin
    ovTable := WebBrowser1.OleObject.Document.All.Tags('TABLE').Item(0);

    for I := 1 to 6 do
      begin
        sLine := ovTable.Rows.Item(I).Cells.Item(0).InnerText + ': ' +
                 ovTable.Rows.Item(I).Cells.Item(1).InnerText;

        Memo1.Lines.Add(sLine);
      end;
end;

Zmienną sLine możesz pominąć i od razu pakować wynik sumowania łańcuchów do metody Memo1.Lines.Add();

Poza tym jak zawsze każdemu kodowemu leniowi powtarzam - formatuj kod i nazywaj po ludzku kontrolki (w ogóle zacznij ustalać im własne identyfikatory, a nie Form1, Button1, WebBrowser1 itd.); Dbaj o kod jak należy;

0

Dzizas ludzie.

Zdrutowałem kawałek kodu, żeby sprawdzić czy działa to o co mi chodziło.

Owszem - elegancja = 0. Ale jakie to ma znaczenie. Ktoś, kto kuma zasadę (którą wyłuszczyłem kilka linii poniżej kodu) sobie poradzi. Ktoś, kto nie kuma, to nawet i kod robiący fiku miku na patyku nic nie pomoże.

EDIT: Jeszcze jedno. W tym konpretnym przykładzie wkleiłem kawałek kodu, który akurat tak się złożył, że odczytuje tabelę dwukolumnową - nazwa pola - wartość. Na stronie jest 8 tabel. Pozostałe trzeba odczytywać z dokładnością do komórki, żeby to poukłądać odpowiednio do struktury bazy danych, którą przygotowałe i jakie wymagania dalszego raportowania ma klient końcowy.

Czasem trzeba po prostu zdrutować, bo kiwanie się tydzień nad efektywnością kodu ma nikłe znaczenie, kiedy drut zostanie odpalony raz, napełni bazę danych i nigdy więcej nie będzie odpalany.


A, że oho przyjął sobie za punkt honoru poniżanie mnie, to zupełnie inna para kaloszy.

Pierwsze zdanie z pierwszego postu w tym wątku odnosiło się wprost do niego. Ma chłopak wielkie mniemanie o sobie. W porządku. Jeżeli w ten sposób rekompensuje sobie braki w innych obszarach - niech będzie. Jeżeli pomoże mu się to poczuć lepiej - tez super.

Jesteś kolego oho fajny. Jesteś kolego oho wielki. Jesteś dla mnie guru. Mam nadzieję, że nigdy nie wyjdziesz, ze swojego ciasnego pudełka.


Wracając do meritum. Nazywać obiekty ? Po co ? Czy kompilatorowi robi to jakąkolwiek różnicę ? Wiesz ? Robiłem kiedyś interface połączeniowy między bazą Axapty Microfostu, a Softlab ERP. Tabele w bazie Axapty i pola nazywane są przypadkowo. Nie ma żadnego schematu. Wiadomo tylko, że mają sześć znaków. Tyle. Resztę trzeba wydedukować Profilerem.

Podobnie jest zbudowany system obsługi placówek medycznych KS-PPS Kamsoftu.

Nazewnictwo wg klucza nie ma ŻADNEGO znaczenia. Programista umiejący czytać kod poradzi sobie na pierwszy rzut oka - umie ocenić co robi kod.

Ja wiem, że puryści zaraz mine oplują i obrzucą błotem. Trudno. Widać nie robili nigdy na prawdę dużych projektów.

No ale. To moja filozofia. Możecie się nie zgadzać - nie zabraniam. Ale nim zaczniecie opluwać musicie wiedzieć, że i tak mnie to nie obchodzi.

0

Ha. Okazuje się, że w moim przypadku mam super ułatwioną sprawę, bo mogę potraktować interesujące mnie strony jak plik XML i odpytać banalnymi zapytaniami XPatha.

Można zamknąć wątek, co by nie ciągnąć bzdurnych dyskusji o niczym ...

1

A, że oho przyjął sobie za punkt honoru poniżanie mnie, to zupełnie inna para kaloszy.

Chciałbyś :)

Pierwsze zdanie z pierwszego postu w tym wątku odnosiło się wprost do niego.

Mogłeś grzecznie napisać że nie chcesz żeby osoba o nicku '-123oho' nie pisała tutaj co bym równie grzecznie zignorował.

Ma chłopak wielkie mniemanie o sobie. W porządku. Jeżeli w ten sposób rekompensuje sobie braki w innych obszarach - niech będzie. Jeżeli pomoże mu się to poczuć lepiej - tez super.

Wytłumacz mi co ma komentarz o tym że warto było użyć fora do mojego wielkiego mniemania. Nic. Kierujesz się tym jak już się wobec ciebie zachowałem. Ignorujesz moje dobre rady, patrzysz tylko na nick. To że masz jakąś fobię do mnie to już wiem od dawna.

Jesteś kolego oho fajny. Jesteś kolego oho wielki. Jesteś dla mnie guru. Mam nadzieję, że nigdy nie wyjdziesz, ze swojego ciasnego pudełka.

To brzmi jak wypowiedź gimnazjalisty. Nie rusza mnie to.
I nie wiem czemu nazywasz mnie 'oho', skoro nie znasz mojego prawdziwego nicku to pisz po nicku którego używam.

Zdrutowałem kawałek kodu, żeby sprawdzić czy działa to o co mi chodziło.

Mogłeś przepisać ten kawałek kodu żeby był ładniejszy. Domyślałem się zresztą że pisałeś na szybko i dlatego brakuje ogładzenia. Niestety ty dokonałeś daleko idącej nadinterpretacji.

@-123oho ma rację (choć wypowiedź jak zwykle bulwersująca)

Bulwersująca? Chyba przesadzacie, nie dość że często piszę gorsze rzeczy to jeszcze ostatnimi czasy generalnie jestem potulny jak baranek... Już dawno nie bulwersuję.

Można zamknąć wątek, co by nie ciągnąć bzdurnych dyskusji o niczym ...

To czy dyskusja będzie się ciągnąć zależy od stron dyskusji.

0

Kłopot w tym kolego, że po zniżeniu się do twojego poziomu ze staru przegrywam. Przewyższasz mnie doświadczeniem. Dlatego użwając twoich słów:

-123oho napisał(a):

Nie mam zamiaru kontynuować z tobą tej bezsensownej konwersacji.

Duskutuj sobie sam ze sobą. Ta choroba nazywa się schizofrenia.

0

Ciągle odnoszę wrażenie że rozmawiam z jakimś trochę przerośniętym gimnazjalistą.

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