Creazione di un file CSV da una pagina HTML
-
26-10-2019 - |
Domanda
ho estratto record da un database e li memorizzati su una pagina HTML con solo testo. Ogni record è memorizzato in un campo <p>
paragrafo e separata da una <br />
interruzione di linea e una linea <hr>
.
Ad esempio:
Company Name<br/>
555-555-555<br />
Address Line 1<br />
Address Line 2<br />
Website: www.example.com<br />
Ho solo bisogno di inserire questi record in un file CSV. Ho usato fputcsv in combinazione con array () e file_get_contents (), ma leggere il mio l'intero codice sorgente della pagina web in un file .csv e un sacco di dati mancava pure. Questi sono più record memorizzati nello stesso formato. Così, dopo un intero blocco di record come visto sopra, è separata da un tag linea <hr>
. Voglio leggere il nome della società nella colonna Nome, il numero di telefono nella colonna del telefono, gli indirizzi nella colonna Indirizzo e il sito web nella colonna Sito come illustrato di seguito.
http://i.stack.imgur.com/00Gxw.png
Come posso fare questo?
Snippet del HTML:
1 Stop Signs<br />
480-961-7446<br />
500 N. 56th Street<br />
Chandler, AZ 85226<br />
<br />
Website: www.1stopsigns.com<br />
<br />
</p><br /><hr><br />
E 'distanziati come questo nella fonte del HTML.
Soluzione
Supponendo html quella mostrata sopra è ben formata, il mio approccio a questo problema deve essere in 2 fasi. Primo. Cancellare un po 'il testo HTML di essere più efficiente per esportare o gestire le informazioni. Qui cercare di cancellare gli elementi che si desidera salvare e cancellare quelli che sai che non si vuole richiedere nel prossimo futuro.
$html = preg_replace("|\s{2,}|si"," ",$html); // clear non neccesary spaces
$html = preg_replace("|\n{2,}|si","\n",$html); // convert more return line to only one
$html = preg_replace("|<br />|si","##",$html); // replace those tags with this one
Poi avrete un html più pulito per il lavoro con simile a questo ....
1 Stop Signs##
480-961-7446##
500 N. 56th Street##
Chandler, AZ 85226##
Website: www.1stopsigns.com##
##
</p>##<hr>##
Seconda. Ora è possibile esplodere i campi o fare un implodere in un valore separato da virgole per formare un csv
// here you'll have the fields to work with into the array called $csv_parts
$csv_parts = explode("##",$html);
// imploding, so there you have the formatted csv similar to 1 Stop Signs,480-961-7446,..
$csv = implode(",",$csv_parts);
Ora avrete un due modi di lavorare con il codice html per l'estrazione dei campi o esportare il CSV.
Spero che questo aiuta o vi darà un'idea di sviluppare ciò che è necessario.
Altri suggerimenti
Supponendo che i dati segue un modello in cui ogni record è separato da un tag <hr>
ed ogni campo all'interno è separato da una <br />
allora si dovrebbe essere in grado di suddividere i dati.
Ci sono un sacco di modi per farlo, ma un modo ingenuo che lavoro potrebbe utilizzare explode()
potrebbe essere qualcosa del tipo:
// open a file pointer to csv
$fp = fopen('records.csv', 'w');
// first, split each record into a separate array element
$records = explode('<hr>', $str);
// then iterate over this array
foreach ($records as $record) {
// strip tags and trim enclosing whitespace
$stripped = trim(strip_tags($record));
// explode by end-of-line
$fields = explode(PHP_EOL, $stripped);
// array walk over each field and trim whitespace
array_walk($fields, function(&$field) {
$field = trim($field);
});
// create row
$row = array(
$fields[0], // name
$fields[1], // phone
sprintf('%s, %s', $fields[2], $fields[3]), // address
$fields[6], // web
);
// write cleaned array of fields to csv
fputcsv($fp, $row);
}
// done
fclose($fp);
Dove $str
sono i dati pagina che stai analisi. Spero che questo aiuti.
Modifica
non ha notato i requisiti di campo specifico in origine. Aggiornato l'esempio.
Di gran lunga il modo più semplice sarebbe quella di prendere semplicemente il tutto blocco, goccia dal tag <hr>
avanti poi dividere la stringa come un array di stringhe sui Tags <br />
.