Pobieranie wartości zmiennej z strony

0

Witam, potrzebuję pobrac z strony dwie wartości, kod strony

<td style="text-align: right;">  2789.0</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">1798</td>
<td style="text-align: right;">0:9 h</td>
<td style="text-align: center;">     0.02255</td>
<td style="text-align: right;">    364.4</td>
<td style="text-align: center; color: #00cc00; "> 1.20</td>
</tr>
<tr>
<td style="text-align: right;">   439.7</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">298</td>
<td style="text-align: right;">0:5 h</td>
<td style="text-align: center;">     0.00365</td>
<td style="text-align: right;"> 102442.5</td>
<td style="text-align: center; color: #cc0000; "> 0.26</td>
</tr>
<tr>

Celem jest pobranie 0.28 i 1.20, chce pobierac te wartości, one są zmienne co odświeżenie strony. własicwie nie wiem jak do tego sie zabrac, z strony delphi to pewnie pakiet synapse okaże sie pomocny aczkolwiek gorzej z zlokalizowaniem i samym wyszukaniem.

0

łap, wyciągnie jedną liczbę z tego, 1.20, bo 0.28 nie istnieje w tym kodzie twoim, może chodziło ci o podobną:

Jako, że strony nie podałeś, to wkleiłem ten twój kod do komponentu TMemo, ty sobie po prostu zamiast pobierać z Memo1, pobierzesz ze strony coś linijką kodu:

source := idHttp1.Get('www.jakastrona.pl/cokolwiek.html');

Oto gotowiec (wycinek kodu):

implementation

{$R *.dfm}

function Wyciagnij1(source: string): string;
var
  tag1, tag2: string;
  pos1, pos2: Integer;
begin
  tag1 := '<td style="text-align: center; color: #00cc00; ">';
  tag2 := '</td>';

  pos1 := Pos(tag1, source);
  Delete(source, 1, pos1 + Length(tag1));
  pos2 := Pos(tag2, source);
  source := Copy(source, 0, pos2 - 1);
  Result := source;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  source: string;
begin
  source := Memo1.Text;
  Edit1.Text := Wyciagnij1(source);
end;

tyle, że jak chcesz te liczby porównywać, to se przekonwertuj String na Double, Real, czy Float, czy na coś

0

problem jest taki że kolor tez jest zmienny #cc0000 i nie tylko dwa są takie kawałki kodu, a co do 0.28 to tak pomyliłem sie, a przy uzyiu idhttp wywala mi error 10061....

0
function Parse(var Str:String;const Delimeter:String):String;
var P:Integer;
begin
  P:=Pos(Delimeter,Str);
  if P>0 then
  begin
    Result:=Copy(Str,1,P-1);
    Delete(Str,1,P+Length(Delimeter)-1);
  end
  else
  begin
    Result:=Str;
    SetLength(Str,0);
  end;
end;

source:=idHttp1.Get('www.jakastrona.pl/cokolwiek.html');
while Length(source)>0 do
begin
   Parse(source,'<td style="text-align: center; color:');
   Parse(source,'; ">');
   Data:=Trim(Parse(source,'</td>'));
   WriteLn(Data);
end;
0

funkcja zwraca puste pole w zmiennej data, cały obszar kodu który jest istotny wygląda tak:

<tr>
<td style="text-align: left;">Nazwa1</td>
<td style="text-align: right;">    88.</td>
<td style="text-align: center;"> 20%</td>
<td style="text-align: right;">86</td>
<td style="text-align: right;">108 h</td>
<td style="text-align: center;">     1.00000</td>
<td style="text-align: right;">8974296.0</td>
<td style="text-align: center;"> 1.00</td>
</tr>
<tr>
<td style="text-align: left;">Nazwa2</td>
<td style="text-align: right;">   282</td>
<td style="text-align: center;">---</td>
<td style="text-align: right;">261</td>
<td style="text-align: right;">1:26 h</td>
<td style="text-align: center;">     0.00212</td>
<td style="text-align: right;"> 312001.9</td>
<td style="text-align: center; color: #00cc00; "> 1.02</td>
</tr>
<tr>
<td style="text-align: left;">Nazwa3</td>
<td style="text-align: right;">  2747</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">1833</td>
<td style="text-align: right;">0:27 h</td>
<td style="text-align: center;">     0.02239</td>
<td style="text-align: right;">    364.4</td>
<td style="text-align: center; color: #00cc00; "> 1.19</td>
</tr>
<tr>
<td style="text-align: left;">Nazwa4</td>
<td style="text-align: right;">   413.6</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">281</td>
<td style="text-align: right;">0:6 h</td>
<td style="text-align: center;">     0.00358</td>
<td style="text-align: right;">  32812.1</td>
<td style="text-align: center; color: #cc0000; "> 0.78</td>
</tr>

I potrzebuje zapisac do zmiennej, wartość 1.19 z tabelki Nazwa4 przy czym w tabelce stała jest tylko nazwa.
chyba teraz jasniej to napisałem.

0

W tej tabelce? :

<tr>
<td style="text-align: left;">Nazwa4</td>
<td style="text-align: right;">   413.6</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">281</td>
<td style="text-align: right;">0:6 h</td>
<td style="text-align: center;">     0.00358</td>
<td style="text-align: right;">  32812.1</td>
<td style="text-align: center; color: #cc0000; "> 0.78</td>
</tr>

a gdzie tu masz 1.19..?

Kombinujesz jak koń pod górę, zamiast zapisać sobie wersje w pliku INI, po czym pobrać plik i w banalny sposób sprawdzić, czy wymagany jest update czy nie...

EDIT: I nie zakładaj dziesięciu wątków, jeśli cały czas masz jeden problem.
Fakt, to nie Twój, choć o to samo chodzi;

0

przepraszam, z tabelki nazwa3, wartosc 1.19 która jest zmienna, i nie zakładałem wielu wątków, tylko ten. Co załadowanie strony wartośc jest inna i musze ją pobrać.

0

Skoro w tabelce stała jest nazwa, to trzeba odszukać wiersz z tą nazwą, a następnie przejść do linii z interesującą wartością i wyłuskać ją za pomocą funkcji Pos, PosEx i Copy.

0

nie mam pojęcia jak to znaleŹć, tzn zlokalizować element Nazwa3 np to tak ale co dalej, i jak przekopiowac do zmiennej wartosc?

0

"Lokallizujesz" przy pomocy funkcji Pos. Zresztą wszystko już zostało podpowiedziane w tym wątku przez poprzedników - jeżeli chodzi o podstawowe wydobywanie stringów, bez zewnętrznych modułów. Szkoda, że nie chcesz poczytać o tych funkcjach, a później SAMODZIELNIE ogarnąć spsoób zaprogramowania tego, bez pytania co chwilę na forum. Nie chcesz łatwym sposobem? No to użyj wyrażen regularnych. Polecam ten moduł z: http://regexpstudio.com/TRegExpr/TRegExpr.html - przykładowy kod z jego użyciem poniżej:

uses
  regexpr;

function PokombinujSamZanimZapytasz(InputStr : string) : string;
var
  R : TRegExpr;
begin
  Result := '';
  R := TRegExpr.Create;
  try
    R.Expression := '<td style="text-align: left;">Nazwa3</td>(.+?)"> ([0-9\.]+)</td>(.+?)</tr>';
    if R.Exec(InputStr) then
    begin
      Result := R.Match[2];
    end;
  finally
    R.Free;
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  Caption := PokombinujSamZanimZapytasz(Memo1.Text);
end;

Żeby się nie rozpisywać co ma jakie znaczenie w wyrażeniach regularnych, podaje link do polskiego forum Total Commandera: http://totalcmd.pl/forum/viewtopic.php?pid=2405#p2405 - tam tłumaczę na szybko, jak "krowie na rowie" podstawy. Chociaż i tak to wiele nie pomogło, bo ludzie są tam tak leniwi jak wielu pytających tutaj. I zamiast pokobminować samodzielnie - to nie potrafią ogarnąc masowej zmiany nazw plików pod Total Commanderem, który zresztą do tego celu wykorzystuje ten sam moduł, do którego podałem przykład kodu oraz link. Wszyscy woleli by tylko pytać, a często nikt później nie chce przyswajać uzyskanej wiedzy.

0

no niestety, fukncja zwraca pustą wartość, czy może to byc spowodowane tym że pobierany jest cały kod strony, i spacje i inne znaki przeszkadzają w lokalizacji i pobraniu danych?

0

Jeżeli zwraca pustą wartośc, to znaczy, że instrukcja if R.Exec... zwróciła False lub R.Match[2] jest puste. Najlepiej sprawdź to debuggerem. Oczywiste żeby R.Match[2] zwróciło żądaną wartość, to musi w kodzie być odpowiedni tekst, pasujący do wzorca. Jeżeli to będzie taka zawartość jak poniżej to na pewno zwróci to co oczekujesz. Czyli 1.19. Dla pewności, że linijki nie skopały się w Memo, zrobiłem ładowanie z pliku:

var
  SL : TStringList;
begin
  SL := TStringList.Create;
  SL.LoadFromFile('D:\test.txt');
  Caption := PokombinujSamZanimZapytasz(SL.Text);
  SL.Free;
end;

Z każdym razem podajesz inny kod strony. Tutaj nawet jeden znak innej wielkości w nazwie albo inna ilość spacji przed tą liczbą będą miały znaczenie. Jeżeli ta ilośc spacji się zmienia, co widać w innych polach, ale zawsze występuje to najlepiej wstaw tam (.+?) albo ([\x20]+) i zmień odpowiednio liczbę po R.Match na wyższą. A najlepiej podaj stronę, skąd idą te dane - jeżeli jest publiczna lub zdecyduj się na ostateczną wersję kodu html jaki otrzymujesz, to będzie można coś doradzić. Bo tak co post podajesz inną wersję. I coś tam CI nie działa. Na co powinieneś już umieć reagować samodzielnie, po tylu przykładach. Ja swój kod sprawdziłem. I działa dla takiego przykładu, jaki dałeś. Bo nie mam w zwyczaju dawać tutaj niesprsawdzonych rozwiązań, chyba że o tym wspomnę w postcie, że czegoś nie jestem pewien.

<tr>
<td style="text-align: left;">Nazwa1</td>
<td style="text-align: right;">    88.</td>
<td style="text-align: center;"> 20%</td>
<td style="text-align: right;">86</td>
<td style="text-align: right;">108 h</td>
<td style="text-align: center;">     1.00000</td>
<td style="text-align: right;">8974296.0</td>
<td style="text-align: center;"> 1.00</td>
</tr>
<tr>
<td style="text-align: left;">Nazwa2</td>
<td style="text-align: right;">   282</td>
<td style="text-align: center;">---</td>
<td style="text-align: right;">261</td>
<td style="text-align: right;">1:26 h</td>
<td style="text-align: center;">     0.00212</td>
<td style="text-align: right;"> 312001.9</td>
<td style="text-align: center; color: #00cc00; "> 1.02</td>
</tr>
<tr>
<td style="text-align: left;">Nazwa3</td>
<td style="text-align: right;">  2747</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">1833</td>
<td style="text-align: right;">0:27 h</td>
<td style="text-align: center;">     0.02239</td>
<td style="text-align: right;">    364.4</td>
<td style="text-align: center; color: #00cc00; "> 1.19</td>
</tr>
<tr>
<td style="text-align: left;">Nazwa4</td>
<td style="text-align: right;">   413.6</td>
<td style="text-align: center;">100%</td>
<td style="text-align: right;">281</td>
<td style="text-align: right;">0:6 h</td>
<td style="text-align: center;">     0.00358</td>
<td style="text-align: right;">  32812.1</td>
<td style="text-align: center; color: #cc0000; "> 0.78</td>
</tr>
0

Pisałem w któryms poście że wszystkie wartości oprócz nazwy są zmienne, zaraz będę kombinować dalej. Pozdrawiam i dziękuje za pomoc.

0
lot3r napisał(a):

Pisałem w któryms poście że wszystkie wartości oprócz nazwy są zmienne, zaraz będę kombinować dalej. Pozdrawiam i dziękuje za pomoc.

No to mój kod będzie działać dla Nazwa3 i tak jak dalej. Wpisy (.+?) to dowolny tekst, ale przynajmniej jeden znak. Jak wspomniałem - może być problem jeżeli jest za każdym razem różna ilość spacji. Dopasuj sobie własność Expression tak aby uzyskasć co chcesz, to wszystko będzie działać. Oczywiście, tak jak wpspomniałem. Dla podanego przykładu, mój kod jest prawidłowy i zwraca to, co chciałeś.

0

faktycznie działa, aczkolwiek problem pojawia sie w momencie gdy ładuje cały dokument html, na wycinku działa, więc nie jest to wina spacji, ich ilosc w tym fragmencie sie nie zmienia.

0

To wrzuć gdzieś ten cały dokument HTML, to sprawdzę. I sprecyzuj czy chcesz na pewno wyciągnąc to samo, o czym wspominałeś (bo często zmieniałeś tutaj zdanie). Według mnie to, że tekst do parsowania będzie dłuższy - nie powinno mieć znaczenia. Oczywiście jeżeli kluczowy fragment jest bez zmian.

0

O to chodzi?

function Parse(var Str:String;const Delimeter:String):String;
var P:Integer;
begin
  P:=Pos(Delimeter,Str);
  if P>0 then
  begin
    Result:=Copy(Str,1,P-1);
    Delete(Str,1,P+Length(Delimeter)-1);
  end
  else
  begin
    Result:=Str;
    SetLength(Str,0);
  end;
end;
 

source:=idHttp1.Get('www.jakastrona.pl/cokolwiek.html');
search:='Nazwa3';
Parse(source,'">'+search+'</td>');
for I:=1 to 6 do Parse(source,'</td>');
Parse(source,'">');
Data:=Trim(Parse(source,'</td>'));
WriteLn(Data);
0

Właściwie problmem nie jest cały dokument, tylko zmieniające sie liczby i znaki w tabeli, próbowałem zmienić ten kod według twoich zaleceń, Olesio aczkolwiek ciągle otrzymuje pusty wynik, nie dokońca rozumiem działania tej funkcji. Swoją drogą próbowałem użyć modułu Mshtml, aczkolwiek przy ładowaniu jakiejkolwiek zmiennej crashowało aplikacjie. A kod od użytkownika Dragon, niestety także zwraca pusty wynik.

0

To może załaduj kod strony do obiektu typu TStrings (czy TStringList), w pętli odszukaj linię z nazwą dla tabelki, natępnie przeskocz do linii, w której znajduje się szukana wartość (bo wiesz ile linii trzeba pominąć) i wyciąg ją przy pomocy Pos, PosEx i Copy.

0

Owszem, na niezaktualizowanej tabelce działa, ale gdy pobieram aktualne dane, czyli :

<TR>
<TD style="TEXT-ALIGN: left">Nazwa1</TD>
<TD style="TEXT-ALIGN: right">86.6 G</TD>
<TD style="TEXT-ALIGN: center">70%</TD>
<TD style="TEXT-ALIGN: right">95</TD>
<TD style="TEXT-ALIGN: right">134 h</TD>
<TD style="TEXT-ALIGN: center">1.00000</TD>
<TD style="TEXT-ALIGN: right">8974296.0</TD>
<TD style="TEXT-ALIGN: center">1.00</TD></TR>
<TR>
<TD style="TEXT-ALIGN: left">Nazwa2</TD>
<TD style="TEXT-ALIGN: right">331.8 GH</TD>
<TD style="TEXT-ALIGN: center">---</TD>
<TD style="TEXT-ALIGN: right">252</TD>
<TD style="TEXT-ALIGN: right">0:12 h</TD>
<TD style="TEXT-ALIGN: center">0.00229</TD>
<TD style="TEXT-ALIGN: right">310122.6</TD>
<TD style="TEXT-ALIGN: center; COLOR: #00cc00">1.12</TD></TR>
<TR>
<TD style="TEXT-ALIGN: left">Nazwa3</TD>
<TD style="TEXT-ALIGN: right">2650.0 M</TD>
<TD style="TEXT-ALIGN: center">100%</TD>
<TD style="TEXT-ALIGN: right">1843</TD>
<TD style="TEXT-ALIGN: right">0:8 h</TD>
<TD style="TEXT-ALIGN: center">0.02250</TD>
<TD style="TEXT-ALIGN: right">374.9</TD>
<TD style="TEXT-ALIGN: center; COLOR: #00cc00">1.17</TD></TR>
<TR>
<TD style="TEXT-ALIGN: left">Nazwa4</TD>
<TD style="TEXT-ALIGN: right">637.3 G</TD>
<TD style="TEXT-ALIGN: center">100%</TD>
<TD style="TEXT-ALIGN: right">366</TD>
<TD style="TEXT-ALIGN: right">0:3 h</TD>
<TD style="TEXT-ALIGN: center">0.00510</TD>
<TD style="TEXT-ALIGN: right">26030.3</TD>
<TD style="TEXT-ALIGN: center; COLOR: #00cc00">1.41</TD></TR>
<TR>
<TD style="TEXT-ALIGN: left">FRC</TD>
<TD style="TEXT-ALIGN: right">228.2 GH</TD>
<TD style="TEXT-ALIGN: center">---</TD>
<TD style="TEXT-ALIGN: right">148</TD>
<TD style="TEXT-ALIGN: right">0:0 h</TD>
<TD style="TEXT-ALIGN: center">---</TD>
<TD style="TEXT-ALIGN: right">32443.2</TD>
<TD style="TEXT-ALIGN: center">---</TD></TR>
<TR>

wtedy funkcja zwraca pustą wartość

0

Dodana jest tabelka z nazwą FRC, więc z której tabelki teraz ma być pobrana liczba? Z FRC, czy z Nazwa4? A może jeszcze z innej..?

0

@lot3r: Bez ogarniania podstaw daleko nie zajdziesz. Jak niby ma Ci z powyższego wyciągnąc 1.17, skoro i to wokól Nazwa3 różni się od tego, co podałeś poprzednio i ma odzwierciedlenie w funkcji, jak również brakuje tam spacji przed samą liczbą do wyciągnięcia. Nie wspominam już o tym, że tutaj wielkość liter jest inna, więc albo to się zmienia albo zrobić należy konwersję przez funkcję AnsiLowerCase. Ale wtedy wszystko we własności Expression musi być małymi literami. Koncówka bloku też jest tym razem w tej samej linijce. Anyway, poniższy kod sprawdzony i działa. Wczytałem z pliku tekstowego to, co podałeś powyżej. Dalej jeśli znowu coś się zmieni to radź sobie sam. My programu za Ciebie nie napiszemy. Potrzebne Ci jest trochę samodzielnego myślenia.

uses
  regexpr;

function PokombinujSamZanimZapytasz(InputStr : string) : string;
var
  R : TRegExpr;
begin
  Result := '';
  R := TRegExpr.Create;
  try
    R.Expression := '<TD style="TEXT-ALIGN: left">Nazwa3</TD>(.+?)">([0-9\.]+)</TD></TR>';
    if R.Exec(InputStr) then
    begin
      Result := R.Match[2];
    end;
  finally
    R.Free;
  end;
end;
0

Teraz działa, dzięki. a tak swoja drogą od początk mowiłem że w tabelce wszystko jest zmienne prócz nazwy, a z delphi nigdy nie mialem doświadczenia operacji na stringach itd.

0

Spoko, jak byś od razu wkleił to co ostatnio i sprecyzował czego potrzebujesz z tych danych to od razu miałbyś działającą metodę.

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