Estrazione dati da file.html

  • Creatore Discussione Creatore Discussione Ariswan
  • Data di inizio Data di inizio

Ariswan

Nuovo Utente
8 Mar 2012
11
0
0
Un saluto generale, seguo Mr. Webmaster da un bel po' ma adesso mi sono registrato per farmi aiutare un po'.

Ho un problema e non riesco a venirne a capo da un paio di giorni :dipser:
Ho salvato il sorgente di questa pagina, tramite libreria cURL, in un file.html e poiché m'interessa solo una porzione di tutto l'html, nello specifico solo la tabella con i voli con tutti i dati al suo interno, non so come sviluppare lo script per fare ciò e quindi eliminare tutto il resto del codice che non m'interessa.
Mi serve perché poi devo scrivere un altro script che elabora i dati, secondo un particolare ragionamento, e poi li invia ad un server.

Ho perso giorni a cercare di capire se usare le espressioni regolari (mai usate e complicatissime) o altre funzioni ma ciò che ho trovato su internet è dispersivo e poco adatto al mio caso e purtroppo il mio php è un po' limitato così come il mio inglese :(
Ovviamente non vi chiedo di sviluppare il codice per me (così vi prendete tutto il divertimento, ah!), mi serve solo qualche piccolo consiglio da qualcuno più esperto di me.

Spero possiate aiutarmi, ringrazio in anticipo :D
 
ciao
puo provare a fare così (ma non giuro che funzi)
PHP:
<?php
//..........
//se i tuoi dati sono racchiusi in una tabella <table>.....</table>
//con il seguente pattern dovresti leggerne il contenuto
$pattern = "#\<table\>(.*?)\</table\>#si";
preg_match($pattern,$pagina,$matches);
$result = isset($matches[0]) ? $matches[0] : '';
//............
?>
se non funzia spera in qualcuno più esoerto di me
 
Ti ringrazio :)
fortunatamente ho risolto in un altro modo, con la funzione substr: impostando il numero di caratteri da saltare all'inizio e quelli da eliminare alla fine, sono riuscito ad isolare la tabella che mi serve.

Questo è il risultato e credo che possa andare bene.

Adesso, dovrei estrarre i dati uno per uno per elaborarli, trasformare ogni stringa in array suppongo.. Quel che serve a me è: estrarre i voli provenienti da Fiumicino e Malpensa e salvarli se hanno subito un ritardo superiore alle 3 ore, o se sono stati cancellati.
Ecco, questo non so proprio come farlo :(

Magari date un'occhiata al sorgente con firebug, nel tbody di <table class="TableOrari"> ci sono: <tr class="table_head"> con l'indice dei dati: Compagnia, numero volo, provenienza, orario pianificato, orario stimato e infine le note, nel quale viene scritto se il volo è stato cancellato oppure se è atterrato.
Successivamente ci sono i dati veri e propri e sono quelli che devo estrarre ed elaborare: <tr class="bg_voli1"> con i vari td class, logo, nVolo, provenienza, schedulato, stimato e note..

Boh, sto impazzendo
 
ciao
puoi provare una cosa del genere, guarda però che è un'idea comunque da perfezionare
lascio i vari var_dump per vedere come si trasforma il testo da passaggio a passaggio (lo vedi meglio poi anche con visualizza sorgente)

PHP:
<?php
//questo per simulare il file di testo
$pagina=<<< EOD
<table>
<tr>
<td class="provenienza">VERONA<div></div></td>
<td class="schedulato">11:15</td>
<td class="stimato">10:45</td>
<td class="note">ATTERRATO</td>
</tr>
<tr>
<td class="provenienza">VENEZIA<div></div></td>
<td class="schedulato">12:15</td>
<td class="stimato">15:45</td>
<td class="note">SCHEDULATO</td>
</tr>
</table>
EOD;
var_dump($pagina);echo "<br>";
$pagina=strip_tags($pagina, "<td>");//elimino tutti i tag escluso i <td>
var_dump($pagina);echo "<br>";
$pagina=trim(str_replace("<td class=\"provenienza\">","|",$pagina));//divido per provenienza con |
var_dump($pagina);echo "<br>";
$piu_pagine=explode("|",$pagina);
var_dump($piu_pagine);echo "<br>";
unset($piu_pagine[0]);
var_dump($piu_pagine);echo "<br><br>";
$da_sostituire=array("<td class=\"schedulato\">","<td class=\"stimato\">","<td class=\"note\">");
foreach($piu_pagine as $valore){
	var_dump($valore);echo "<br>";
	$transito=trim(str_replace($da_sostituire,"|",$valore));
	$dato_parziale[]=trim(str_replace("</td>","",$transito));
}
var_dump($dato_parziale);echo "<br>";
foreach($dato_parziale as $valore){
	$divido_il_dato=explode("|",$valore);
	$chiave=trim($divido_il_dato[0]);
	$dato_finale[$chiave][0]=trim($divido_il_dato[1]);
	$dato_finale[$chiave][1]=trim($divido_il_dato[2]);
	$dato_finale[$chiave][2]=trim($divido_il_dato[3]);
}
var_dump($dato_finale);echo " array finale<br>";
/*in questo caso ti ritrovi con un array chiamato $dato_finale composto da
$dato_finale["VERONA"][0] = 11:15
$dato_finale["VERONA"][1] = 10:45
$dato_finale["VERONA"][2] = ATTERRATO
*/
//se poi vuoi utilizzare solo i dati es. di Verona
foreach($dato_finale as $chiave => $valore){
	if($chiave !="VERONA"){//se la chiave non è verona
		unset($dato_finale[$chiave]); //elimini
	}
}
?>
come detto arrivi a ottenere un array con chiave nome della città poi con quello fai ciò che vuoi
 
Soluzione più elegante con i componenti di Symfony (http://www.symfony.com):
PHP:
<?php

use Symfony\Component\DomCrawler\Crawler;

$voli = array();

$crawler = new Crawler(file_get_contents('data.html'));

$crawler   = $crawler->filter('tr.bg_voli1, tr.bg_voli2 ');
$nodeCount = $crawler->count();

$loghi       = $crawler->filter('td.logo > img')->extract('src');
$numeri      = $crawler->filter('td.nVolo')->extract('_text');
$provenienze = $crawler->filter('td.provenienza')->extract('_text');
$schedulati  = $crawler->filter('td.schedulato')->extract('_text');
$stimati     = $crawler->filter('td.stimato')->extract('_text');
$note        = $crawler->filter('td.note')->extract('_text');

$voli = array();

for ($i = 0; $i <= $nodeCount; $i++) {
    $voli[] = array(
        'logo'        => $loghi[$i],
        'numero'      => $numeri[$i],
        'provenienza' => $provenienze[$i],
        'schedulato'  => $schedulati[$i],
        'stimato'     => $stimati[$i],
        'note'        => $note[$i],
    );
}

print_r($voli);
Ovviamente prima dovrai installare le librerie DomCrawler e CssSelector.
 
Non ho mai usato qualcosa del genere, sembra interessante; ti ringrazio per la dritta, e anche per il codice xD

One moment, metti caso che non dovessi utilizzarlo solo in locale questo framework e relative librerie, posso utilizzarlo su un server per un sito web?
 
Ultima modifica:
Ti ringrazio, in generale mi hai detto tutto ciò che devo sapere. Se non riesco apro un thread
 

Discussioni simili