Newsgroup: it.comp.www.php
Titolo: eseguire il parsing di una pagina web

Salve a tutti,
ho una pagina web che contiene una tabella composta da 17 colonne e 13 
righe.
Le celle della tabella contengono solo dati numerici ( prelevati da un 
database )
dovrei intercettare tra i tag html i valori numerici di questa tabella 
per farci sopra dei controlli.
C'è un qualche modo ( forse chiedo troppo al nostro linguaggio ) per 
indicizzare i dati presenti in tabella all'interno di un array ?
Oppure , secondo voi quale può essere un modo per intercettare i valori 
nei campi
Grazie 1000 per qualsiasi tipo di informazione vogliate darmi.
Saluti

 indicizzare i dati presenti in tabella all'interno di un array ?
espressioni regolari
se cerchi solo i dati nelle celle senza pensare alle righe e alle 
colonne, ti bassta fare una preg_match_all fra i <td> e i </td>, se 
devi mantenere anche le colonne.. forse una preg_match_all fra <tr> e 
</tr> e poi un'altra preg_match_all sui risultati per trovare i dati 
nelle colonne..
cmq direi senza dubbio espressioni regolari :)

 farci sopra dei controlli.
Io sto facendo qualcosa di simile in questi giorni.
Per parsare una pagina web sto usando le bellissime funzioni messe a 
disposizione da PHP 5 relative al DOM.
Per controllare poi che il dato sai di tipo numerico, usa 
tranquillamente la funzione is_numeric.
Con una decina di righe di codice risolvi il tutto, in modo anche 
elegante. ;-)
In PHP we trust. :-)
--
rob4you
www.outofmind.eu

Pellix79 ha scritto:

Se sei in grado di riportarti ad almeno una porzione xml-compliant
(magari isolando la tabella, se questa è ben formata, o anche tutto il 
documento, se è xhtml) del tuo html potresti usare
http://www.pear.php.net/package/XML_Serializer
A quel è un giochetto in quanto ti ritroveresti i dati in un comodo 
array associativo.
Ciao
-- 
doh!

 
Dalla tua risposta capisco di non aver specificato alcuni dettagli :-(
Li elenco:
La pagina che dovrei parsare sta su altro host, pertanto dovrei in 
qualche modo , dire a php di aprire determinata pagina ( 
http://10.10.10.10/pagina.php
) come se fosse un file txt e di 
analizzarne il contenuto html.
Riguardo il contenuto delle celle , potrei anche "accontentarmi" di 
avere tutti i dati messi a caso , ma se ci fosse un modo per dargli 
anche una minima ordinata sarebbe meglio.
Questo è quanto , con queste premesse avresti qualche consiglio in più 
da darmi ?
GRazie 1000

 contenuto html.
beh per questo non c'è problema, il modo "grezzo" sarebbe usare una 
fsockopen o ua curl e poi le espressioni regolari
Ma forse ti conviene seguire i consigli degli altri, viene sicuramente 
un lavoro + pulito
anzi, appena trovo 5 min mi ci interesso anche io, fatti dire qualcosa 
in + :P

righe.
Quasi nessun problema, dipende un po' com'e' l'HTML... se e' generato da
un database, non dovrebbero esserci problemi.
Prendi la pagina con $html = file_get_contents($url);
A questo punto ti serve di riconoscere la tabella in questione. Se nella
pagina c'e' una sola tabella sei lesto; ma se no devi sperare che quella
che interessa a te abbia qualcosa di diverso dalle altre. Per esempio il
bordo. Fai un preg_match con '#<table border="1">(.*?)</table>#mis' e se
non ho cannato la regexp :-) ti ritrovi con il contenuto della tabella.
Questo lo parsi in righe con preg__match_all '#<tr[^>]*>(.*?)</tr>#mis',
e ottieni un array (stampalo a video con print_r e vedi com'e' fatto) in
cui dovresti avere 13 righe. Puoi scartare intestazioni e pedici con pop
o array_shift.
A questo punto puoi fare in due modi, sempre con un ciclo foreach() dove
esamini tutte e 13 le righe:
1) Un altro preg_match_all per estrarre '#<td[^>*>(.*?)</td>#mis', e hai
   un vettore con i tuoi 17 elementi riga (e forse altri che elimini con
   i gia' ricordati pop e array_shift, o con array_splice). Raccomandato
   caldamente.
2) str_replace per convertire <td> e </td> in "|" o in qualche carattere
   non usato. A quel punto usi anche strip_tags per levare tutto l'HTML,
   e ottieni una roba che dovrebbe essere |12|27|2.4|3.6|...|... Bisogna
   che tu converta <td>, <td></td> e </td> in | in quest'ordine, e forse
   e' una buona idea eliminare anche "\r" e "\n".
   A questo punto, un semplice explode('|', ...) ti trasforma la riga in
   un vettore.
Alla fine ti puoi ritrovi con una matrice $M[][] in cui $M[3][4] e', per
esempio, la terza riga e quarta colonna (se parti da 1).
Leonardo
-- 
Next in importance to freedom and justice is popular education, without which neither can be permanently maintained.
James A. Garfield (1831 - 1881)

Massi ha scritto:

Adesso dò un occhiata a 
php.net
 e al manuale.
Al momento le funzionalità che mi hai citato sono per me sconosciute.
Mi documento poi eventualmente tornerò a romperti/vi le scatole ;-)
Grazie 1000

 elegante. ;-)
Mi devo documentare , non so cosa siano le DOM , appena ne so qualcosa 
in più tornerò a romperti / vi le scatole ;-)
Grazie 1000  per i consigli.
Ciao

 
Le descrizioni degli altri mi hanno fatto capire che mi devo documentare 
su due o 3 argomenti.
Tu mi hai dato delle soluzioni per poter eseguire intanto l'operazione.
GRazie a tutti ragazzi ( e non ;-) )
Hola

 
Rieccomi qua ;-)
Sto provando a mettere in pratica quanto mi hai consigliato ma ho 
incontrato un primo problema, la pagina contenente la tabella č in 
sessione pertanto dovrei passare per l'index  , autenticarmi e poi 
richiamare l'url interessata.
Mi sa che cosi la cosa si complica :-(
Hai qualche altro consiglio da darmi ?

 Hai qualche altro consiglio da darmi ?
curl!
:)

Hai qualche altro consiglio da darmi ?
Se hai il controllo sulla pagina remota, prevedere una backdoor che usi
una qualche autenticazione diretta. Ci sono vari sistemi anche sicuri -
per esempio, password datarie: fai una prima richiesta per ottenere una
challenge valida, poi fai una seconda richiesta con l'autenticazione.
Es.:
function OpenBackDoor($secret='ServerSidePassword', $minutes=1)
{
	if (isset($_REQUEST['backuser']))
	if (isset($_REQUEST['pass']))
	{
		$users		= array(
			'user'	=> 'password'
		);
		$auth		= false;
		$user		= $_REQUEST['backuser'];
		$pass		= $_REQUEST['pass'];
		if (isset($users[$user]))
		{
			$ck = time() - 60*$minutes;
			for ($start = 0; $start <= $minutes; $start++)
			{
				$chall	= 
 md5("$secret:$user:".date('YmdHi',$ck));
				$ck	+= 60;
				$hsh	= "$chall:$user:$users[$user]";
				if (md5($hsh) == $_REQUEST['pass'])
				{
					$auth = true;
					break;
				}
			}
		}
		if ($auth)
		{
			// Simula un login funzionante in sessione
			$_SESSION['username'] = 'root';
			$_SESSION['loggedin'] = true;
		}
	}
	else
		die(md5("$secret:$user:" . date('YmdHi')));
}
function CloseBackDoor()
{
	if (isset($_REQUEST['backuser']))
		session_destroy();
}
La pagina dopo la modificherai semplicemente mettendoci OpenBackDoor() e
CloseBackDoor() in cima e in fondo, rispettivamente. Le funzioni le puoi
riciclare anche in pagine diverse o per scopi diversi - cambiando magari
il secret.
Per leggere la pagina autenticata fai
	$user = 'miouser';
	$pass = 'miapass';
	$id   = file_get_contents("$URL?backuser=$user");
	$auth = md5("$id:$user:$pass");
 
	$page = file_get_contents("$URL?backuser=$user&pass=$auth");
La password smette di funzionare dopo un certo numero di minuti, sicche'
anche se uno te la intercetta, ci fa poco; e la sessione non si propaga,
per cui puoi fare solo quello che quella _singola_ pagina puo' fare, non
importa quali diritti hai.
Il vantaggio in realta' e' solo che non hai una sessione imbizzarrita in
giro con diritti di amministratore... nel normale svolgimento delle cose
questa che t'ho descritto e' una enorme sega mentale. Ma sai com'e': una
sega e' pur sempre sesso con qualcuno che ami :-)
Inoltre, per funzionare non ha bisogno ne' di curl ne' di stream, il che
in teoria dovrebbe essere ininfluente (dovresti sempre avere l'una o gli
altri, o poterteli far attivare). In pratica non e' detto. Puo' capitare
il giorno che, non avendo un paio di pantaloni, ti potrebbe servire pure
questo antiestetico e goffo barile tenuto su da uno spago :-)
====
Se non hai il controllo sulla pagina remota e' un guaio, perche' bisogna
fare come hai detto: andare su index.php e leggersi la form di login, in
modo da vedere com'e' fatta. In genere avra' l'URL di un'altra pagina (o
della stessa index.php), e alcuni parametri. E inoltre ti potra' rendere
un cookie di sessione o un SID. Prova a leggere la pagina senza i cookie
per vedere se ti manda il SID; e' piu' facile da manipolare.
Ti tocca usare le funzioni stream() e leggere i metadati dello stream in
modo da recuperare l'header Location o il Set-Cookie che ti da' il SID.
Dopodiche', fai una seconda richiesta per la pagina di login, impostando
il SID. Questo ti serve solo per loggarti server side, e cioe' abilitare
il SID (che gia' hai) a richiedere la pagina d'interesse.
La terza richiesta e' quella della pagina in questione. E di li' vai con
le regexp.
Per fare le personcine fini, dovresti fare una quarta (forse una quinta,
dipende dagli schemi) richiesta per sloggarti.
