Thread View: pl.comp.lang.perl
12 messages
12 total messages
Started by Thorvald
Wed, 05 Aug 2009 10:30
Czytanie zawartosci strony www
Author: Thorvald
Date: Wed, 05 Aug 2009 10:30
Date: Wed, 05 Aug 2009 10:30
163 lines
5559 bytes
5559 bytes
Witam serdecznie.
Chcialem poprosic o pomoc w wyszukaniu rozwiazania w jaki sposob
wyswietlic zawartosc strony przy uzyciu perla, zawartosc ktora bedzie
predefiniowana. Moze nie jasno sie wyrazam, ale powiedzmy mam strone
www, ktora ma konstrukcje dosc prosta i potrzebuje z niej wyciagnac
wszystkie linijki kodu ktore zawieraja jakies slowo.... powiedzmy ze
jest to slowo "test".
Znalazlem modul WWW::Mechanize, ktorego uzywam do pobrania zawartosci
strony. Problem polega na tym, ze "porownania" ktore staram sie zrobic
nie dzialaja, i mimo ze chce wyswietlic tylko okreslone linijki, wiec
robie tak:
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
my $login = "login";
my $password = "haslo";
my $mech = WWW::Mechanize->new();
my $www = ('http://localhost/strona.html');
$mech->credentials ($login, $password);
$mech->get($www);
my $content = $mech->content;
$content =~ /test/;
print $content;
Problem polega na tym, ze wyswietlana jest cala zawartosc strony, a
nie tylko ta jedna linia zawierajaca to czego szukam.
Jest to dosc prosty kod, bo generalnie chodzi o to, zeby w efekcie
koncowym stworzyc skrypt w perlu, ktory pobierze dane z nagiosa (z
pliku status.cgi) o hostach ktore sa obecnie "DOWN" i stworzy nowa
strone na ktorej bedzie wyswietlany status. Problem polega na tym, ze
juz zrobilem skrypt ktory wyswietla wszystko idealnie! Tylko nie umiem
zrobic jednego warunku, ze jak wszystkie hosty sa "OK" to ma nie
wyswietlac nic (bo bym musial jakos wrocic do poczatku skryptu). Wiem
ze to troche zawile moze wiec wkleje caly skrypt:
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
my $i;
my $website;
my $website2;
my @website2;
my $table;
my $table_down;
my @host;
my @service;
my @hostdown;
my $login = "login";
my $password = "pass";
my $link;
my @servers = qw(lista serwerow ktore wchodza w sklad monitoringu);
my $server;
my $mech = WWW::Mechanize->new();
my $www = ('http://nagiosurl/cgi-bin/status.cgi');
$mech->credentials ($login, $password);
$mech->get($www);
my $content = $mech->content;
open(MYFILE,'>_nagios_stats_temp.html');
print MYFILE $content;
close (MYFILE);
my $file = '_nagios_stats_temp.html';
open FILE, $file or die "nie ma";
open(WEBSITE,'>/var/www/html/_nagios_stats.html');
$website="<HTML><BODY><H1>Hosts issues</H1>";
$table="<table border=\"1\"><tr><td>Host</td><td>Service</
td><td>Status</td></tr>";
$table_down="<table border=\"1\"><tr><td>Host</td><td>Status</td></
tr>";
print WEBSITE $website;
print WEBSITE $table;
while (<FILE>)
{
if ( m|'statusBGCRITICAL'| && /host=/ )
{
@host = split (/host=(.*)&/, $_);
}
if ( m|'statusBGCRITICAL'| && /host=/ )
{
@service = split (/service=(.*)\'/, $_);
if ($service[1] eq "check_ping")
{
$service[1]="ping";
}
if ($service[1] eq "check_http")
{
$service[1]="http";
}
print WEBSITE "<tr>";
foreach $server(@servers)
{
if ($server =~ /^$host[1]$/)
{
$website2 = "<td>$host[1]</td><td>$service[1]</
td><td>CRITICAL</td></tr>";
print WEBSITE $website2;
}
}
}
}
print WEBSITE "</table><BR><BR>";
close(FILE);
open FILE, $file or die "nie ma";
print WEBSITE $table_down;
while (<FILE>)
{
if ( m|'statusHOSTDOWN'| && /host=/ )
{
@hostdown = split (/host=(.*)\' /, $_);
print WEBSITE "<tr>";
foreach $server(@servers)
{
if ($server =~ /^$hostdown[1]$/)
{
$website2="<td>$hostdown[1]</td><td>DOWN</
td>";
print WEBSITE $website2;
}
}
print WEBSITE "</tr>";
}
}
close(FILE);
print WEBSITE "</table></body></html>";
close(WEBSITE);
Skrypt powyzej konstruuje tabele ktora zawiera wszystkie potrzebne
informacje. Problem w tym, ze nie umiem wyeliminowac budowania tabeli
w momencie kiedy wynik jest rowny 0, bo wszystkie hosty i serwisy sa
OK. Musialbym to wrzucic jakos w pierwsza petle, ale wtedy za kazdym
razem bedzie wykonywane <table...>.
Jakies pomysly ?
Z gory dziekuje za pomoc.
Pozdrawiam
TH
Re: Czytanie zawartosci strony www
Author: Stachu 'Dozzie' K.
Date: Wed, 05 Aug 2009 11:51
Date: Wed, 05 Aug 2009 11:51
26 lines
1873 bytes
1873 bytes
On 05.08.2009, Thorvald wrote: > Witam serdecznie. > > Chcialem poprosic o pomoc w wyszukaniu rozwiazania w jaki sposob > wyswietlic zawartosc strony przy uzyciu perla, zawartosc ktora bedzie > predefiniowana. Moze nie jasno sie wyrazam, ale powiedzmy mam strone > www, ktora ma konstrukcje dosc prosta i potrzebuje z niej wyciagnac > wszystkie linijki kodu ktore zawieraja jakies slowo.... powiedzmy ze > jest to slowo "test". [...] > my $content = $mech->content; > $content =~ /test/; > print $content; > > Problem polega na tym, ze wyswietlana jest cala zawartosc strony, a > nie tylko ta jedna linia zawierajaca to czego szukam. Dziwisz sie? Poprosiles o sprawdzenie czy w $content jest slowo "test"; wynik sprawdzenia cie nie obszedl (nie uzyles go do niczego), a potem wypisujesz zawartosc zmiennej $content. Nie widze tu ani slowa o wypisaniu *linijki* ani o wypisaniu jesli warunek jest spelniony. Czasem warto zrozumiec kod ktory sie pisze. -- Stanislaw Klekot
Re: Czytanie zawartosci strony www
Author: Thorvald
Date: Wed, 05 Aug 2009 12:51
Date: Wed, 05 Aug 2009 12:51
41 lines
2452 bytes
2452 bytes
On 5 Sie, 12:51, "Stachu 'Dozzie' K."
<doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
> Dziwisz sie? Poprosiles o sprawdzenie czy w $content jest slowo "test";
> wynik sprawdzenia cie nie obszedl (nie uzyles go do niczego), a potem
> wypisujesz zawartosc zmiennej $content. Nie widze tu ani slowa
> o wypisaniu *linijki* ani o wypisaniu jesli warunek jest spelniony.
>
> Czasem warto zrozumiec kod ktory sie pisze.
Naiwnie myslalem ze:
my $content = $mech->content;
$content =~ /test/;
print $content;
"podzieli" $content na linie zawierajace slowo test i wypisze mi to co
chcialem.
Zrobilem cos takiego:
Z tego co rozumiem swoj problem, to polega on na tym ze nie za bardzo
potrafie zaimplementowac dodatkowej zmiennej, ktora by zczytywala
tylko to co pasuje (jakas tablica czy cos...), bo nawet:
if ($content =~ /test/)
{ print $content };
wypisze mi cala zawartosc, bo przeciez warunek jest spelniony.
Mam w glowie sposob, jednak pojawia sie chyba brak umiejetnosci
programowania zeby to napisac tak ladnie jak mam to poukladane w
glowie.
Jakies wskazowki ?
>
> --
> Stanislaw Klekot
Pozdrawiam i dziekuje za pomoc,
TH
Re: Czytanie zawartosci strony www
Author: Stachu 'Dozzie' K.
Date: Wed, 05 Aug 2009 12:58
Date: Wed, 05 Aug 2009 12:58
42 lines
2408 bytes
2408 bytes
On 05.08.2009, Thorvald wrote:
> On 5 Sie, 12:51, "Stachu 'Dozzie' K."
><doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
>> Dziwisz sie? Poprosiles o sprawdzenie czy w $content jest slowo "test";
>> wynik sprawdzenia cie nie obszedl (nie uzyles go do niczego), a potem
>> wypisujesz zawartosc zmiennej $content. Nie widze tu ani slowa
>> o wypisaniu *linijki* ani o wypisaniu jesli warunek jest spelniony.
>>
>> Czasem warto zrozumiec kod ktory sie pisze.
>
> Naiwnie myslalem ze:
> my $content = $mech->content;
> $content =~ /test/;
> print $content;
>
> "podzieli" $content na linie zawierajace slowo test i wypisze mi to co
> chcialem.
>
> Zrobilem cos takiego:
>
> Z tego co rozumiem swoj problem, to polega on na tym ze nie za bardzo
> potrafie zaimplementowac dodatkowej zmiennej, ktora by zczytywala
> tylko to co pasuje (jakas tablica czy cos...), bo nawet:
>
> if ($content =~ /test/)
> { print $content };
>
> wypisze mi cala zawartosc, bo przeciez warunek jest spelniony.
Ale i tak juz jest postep. A teraz pomysl tak: bierzesz $content,
dzielisz na linie i dla kazdej linii sprawdzasz czy zawiera slowo
"test".
> Mam w glowie sposob, jednak pojawia sie chyba brak umiejetnosci
> programowania zeby to napisac tak ladnie jak mam to poukladane w
> glowie.
Jesli nie umiesz tego zapisac jako kod (czy pseudokod), to chyba znaczy
ze jednak nie masz tego poukladanego.
--
Stanislaw Klekot
Re: Czytanie zawartosci strony www
Author: Thorvald
Date: Wed, 05 Aug 2009 13:20
Date: Wed, 05 Aug 2009 13:20
22 lines
1822 bytes
1822 bytes
On 5 Sie, 13:58, "Stachu 'Dozzie' K."
<doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
> Ale i tak juz jest postep. A teraz pomysl tak: bierzesz $content,
> dzielisz na linie i dla kazdej linii sprawdzasz czy zawiera slowo
> "test".
my $content = $mech->content;
my @array = split (/ /, $content);
foreach my $array (@array)
{
if ( $array =~ /test/ )
{
print $array;
}
}
Ladnie ? :)
> --
> Stanislaw Klekot
Dziekuje i pozdrawiam,
TH
Re: Czytanie zawartosci strony www
Author: Stachu 'Dozzie' K.
Date: Wed, 05 Aug 2009 13:27
Date: Wed, 05 Aug 2009 13:27
23 lines
1741 bytes
1741 bytes
On 05.08.2009, Thorvald wrote:
> On 5 Sie, 13:58, "Stachu 'Dozzie' K."
><doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
>> Ale i tak juz jest postep. A teraz pomysl tak: bierzesz $content,
>> dzielisz na linie i dla kazdej linii sprawdzasz czy zawiera slowo
>> "test".
> my $content = $mech->content;
> my @array = split (/ /, $content);
> foreach my $array (@array)
> {
> if ( $array =~ /test/ )
> {
> print $array;
> }
> }
>
> Ladnie ? :)
No widzisz, od razu lepiej. Tylko ty akurat chciales wiersz po wierszu,
a dzielisz na spacjach.
--
Stanislaw Klekot
Re: Czytanie zawartosci strony www
Author: Thorvald
Date: Wed, 05 Aug 2009 15:27
Date: Wed, 05 Aug 2009 15:27
17 lines
1831 bytes
1831 bytes
On 5 Sie, 14:27, "Stachu 'Dozzie' K." <doz...@dynamit.im.pwr.wroc.pl.nospam> wrote: > No widzisz, od razu lepiej. Tylko ty akurat chciales wiersz po wierszu, > a dzielisz na spacjach. To juz nie problem :). To co wkleilem to byla wersja beta hehe. Tylko dla sprawdzenia samego algorytmu. Oczywiscie zawarlem \n w split i dziala cudownie ;). > -- > Stanislaw Klekot Dziekuje Ci serdecznie. Pozdrawiam TH
Re: Czytanie zawartosci strony www
Author: Stachu 'Dozzie' K.
Date: Wed, 05 Aug 2009 23:58
Date: Wed, 05 Aug 2009 23:58
73 lines
2713 bytes
2713 bytes
On 05.08.2009, Thorvald wrote:
> On 5 Sie, 14:27, "Stachu 'Dozzie' K."
><doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
>> No widzisz, od razu lepiej. Tylko ty akurat chciales wiersz po wierszu,
>> a dzielisz na spacjach.
>
> To juz nie problem :). To co wkleilem to byla wersja beta hehe.
> Tylko dla sprawdzenia samego algorytmu. Oczywiscie zawarlem \n w split
> i dziala cudownie ;).
To teraz ci jeszcze podpowiem parę rzeczy.
#v+
my $content = $mech->content;
my @array = split (/ /, $content);
foreach my $array (@array)
{
if ( $array =~ /test/ )
{
print $array;
}
}
#v-
Raz, że to powinno wyglądać tak (modulo ilość spacji na wcięcia):
#v+
my $content = $mech->content;
my @array = split (/ /, $content);
foreach my $array (@array)
{
if ( $array =~ /test/ )
{
print $array;
}
}
#v-
Nierówne wcięcia bardzo utrudniają późniejsze czytanie kodu.
Dwa, że @array mogłeś sobie darować:
#v+
my $content = $mech->content;
foreach my $array (split (/ /, $content))
{
if ( $array =~ /test/ )
{
print $array;
}
}
#v-
Trzy, że mogłeś użyć zmiennej domyślnej $_:
#v+
my $content = $mech->content;
foreach (split (/ /, $content))
{
if ( /test/ )
{
print $array;
}
}
#v-
Aż wreszcie mogłeś użyć grepa i notacji postfiksowej:
#v+
print for grep { /test/ } split /\n/, $mech->content;
#v-
--
Stanislaw Klekot
Re: Czytanie zawartosci strony www
Author: Thorvald
Date: Thu, 06 Aug 2009 10:41
Date: Thu, 06 Aug 2009 10:41
26 lines
2491 bytes
2491 bytes
On 6 Sie, 00:58, "Stachu 'Dozzie' K."
<doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
> To teraz ci jeszcze podpowiem parę rzeczy.
> Raz, że to powinno wyglądać tak (modulo ilość spacji na wcięcia):
> Nierówne wcięcia bardzo utrudniają późniejsze czytanie kodu.
> Dwa, że @array mogłeś sobie darować:
> Trzy, że mogłeś użyć zmiennej domyślnej $_:
> Aż wreszcie mogłeś użyć grepa i notacji postfiksowej:
> #v+
> print for grep { /test/ } split /\n/, $mech->content;
> #v-
No widzisz, jestem raczej noga z programowania szczegolnie w perlu :).
Staram sie cos tam dziergac na wlasne potrzeby a tutaj mozna sie potem
wielu rzeczy nauczyc co pokazuje Twoja ostatnia (no w sumie
przedostatnia) linijka ;). Tak czy inaczej dumny jestem z tych
kilkudziesiecu linii kodu, ktore z Twoja pomoca wydziergalem i ciesze
sie jak lysy z grzebienia ze dziala! :).
Jeszcze raz serdeczne dzieki.
> --
> Stanislaw Klekot
Pozdrawiam
TH
Re: Czytanie zawartosci strony www
Author: Stachu 'Dozzie' K.
Date: Thu, 06 Aug 2009 11:08
Date: Thu, 06 Aug 2009 11:08
30 lines
2546 bytes
2546 bytes
On 06.08.2009, Thorvald wrote:
> On 6 Sie, 00:58, "Stachu 'Dozzie' K."
><doz...@dynamit.im.pwr.wroc.pl.nospam> wrote:
>> To teraz ci jeszcze podpowiem parę rzeczy.
>> Raz, że to powinno wyglądać tak (modulo ilość spacji na wcięcia):
>> Nierówne wcięcia bardzo utrudniają późniejsze czytanie kodu.
>> Dwa, że @array mogłeś sobie darować:
>> Trzy, że mogłeś użyć zmiennej domyślnej $_:
>> Aż wreszcie mogłeś użyć grepa i notacji postfiksowej:
>> #v+
>> print for grep { /test/ } split /\n/, $mech->content;
>> #v-
> No widzisz, jestem raczej noga z programowania szczegolnie w perlu :).
> Staram sie cos tam dziergac na wlasne potrzeby a tutaj mozna sie potem
> wielu rzeczy nauczyc co pokazuje Twoja ostatnia (no w sumie
> przedostatnia) linijka ;).
Dlatego nie podalem ci tej linijki od razu, tylko najpierw sam napisales
to co chciales zeby skrypt robil. Dopiero po tym moglem sobie pozwolic
na pokazanie ulepszen (nie za duzo zmian w jednym kroku, bo istotne
rzeczy potrafia umknac).
> Tak czy inaczej dumny jestem z tych
> kilkudziesiecu linii kodu, ktore z Twoja pomoca wydziergalem i ciesze
> sie jak lysy z grzebienia ze dziala! :).
Glad to help.
--
Stanislaw Klekot
Re: Czytanie zawartosci strony www
Author: Szymon Sokół
Date: Thu, 06 Aug 2009 14:57
Date: Thu, 06 Aug 2009 14:57
22 lines
2085 bytes
2085 bytes
On Wed, 5 Aug 2009 23:58:02 +0000 (UTC), Stachu 'Dozzie' K. wrote:
> Trzy, że mogłeś użyć zmiennej domyślnej $_:
>
> #v+
> my $content = $mech->content;
> foreach (split (/ /, $content))
> {
> if ( /test/ )
> {
> print $array;
> }
> }
> #v-
Ta wersja jest błędna :->
--
Szymon Sokół (SS316-RIPE) -- Network Manager B
Computer Center, AGH - University of Science and Technology, Cracow, Poland O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein H
Re: Czytanie zawartosci strony www
Author: Stachu 'Dozzie' K.
Date: Thu, 06 Aug 2009 21:38
Date: Thu, 06 Aug 2009 21:38
38 lines
2000 bytes
2000 bytes
On 06.08.2009, Szymon Sokół wrote:
> On Wed, 5 Aug 2009 23:58:02 +0000 (UTC), Stachu 'Dozzie' K. wrote:
>
>> Trzy, że mogłeś użyć zmiennej domyślnej $_:
>>
>> #v+
>> my $content = $mech->content;
>> foreach (split (/ /, $content))
>> {
>> if ( /test/ )
>> {
>> print $array;
>> }
>> }
>> #v-
>
> Ta wersja jest błędna :->
Coz, tak czasem bywa gdy sie za bardzo ufa kompilatorowi w glowie i nie
puszcza programu na komputerze ;)
Powinno byc:
#v+
my $content = $mech->content;
foreach (split (/ /, $content))
{
if ( /test/ )
{
print;
}
}
#v-
O ile ten kompilator nie zawodzi i tym razem ;>
Za twoja czujnosc wisze ci piwo :)
--
Stanislaw Klekot
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads