Analizzare tabella html con file_get_contents di array php

Sto cercando di analizzare la tabella qui in un multi-dimensionale array php. Sto usando il seguente codice ma per qualche motivo la restituzione di un array vuoto. Dopo aver cercato in giro sul web, ho trovato questo sito che è dove ho ottenuto il parseTable() funzione. Leggendo i commenti su questo sito web, vedo che la funzione funziona perfettamente. Quindi sto supponendo che non ci sia qualcosa di sbagliato con il modo in cui sto di ottenere il codice HTML da file_get_contents(). Ogni pensiero su cosa sto facendo di sbagliato?

<?php

$data = file_get_contents('http://flow935.com/playlist/flowhis.HTM');

function parseTable($html)
{
  //Find the table
  preg_match("/<table.*?>.*?<\/[\s]*table>/s", $html, $table_html);

  //Get title for each row
  preg_match_all("/<th.*?>(.*?)<\/[\s]*th>/", $table_html[0], $matches);
  $row_headers = $matches[1];

  //Iterate each row
  preg_match_all("/<tr.*?>(.*?)<\/[\s]*tr>/s", $table_html[0], $matches);

  $table = array();

  foreach($matches[1] as $row_html)
  {
    preg_match_all("/<td.*?>(.*?)<\/[\s]*td>/", $row_html, $td_matches);
    $row = array();
    for($i=0; $i<count($td_matches[1]); $i++)
    {
      $td = strip_tags(html_entity_decode($td_matches[1][$i]));
      $row[$row_headers[$i]] = $td;
    }

    if(count($row) > 0)
      $table[] = $row;
  }
  return $table;
}

$output = parseTable($data);

print_r($output);

?>

Voglio che la mia matrice di output a guardare qualcosa come questo:

1 
--> 11:33AM 
--> DEV 
--> NEL BUIO 

2 
--> 11:29 
--> LIL' WAYNE 
--> LEI 

3 
--> 11:26AM 
--> KARDINAL OFFISHALL 
--> NUMBA 1 (MAREA È ALTA) 
  • -1 per mancanza di impegno. Isolare il problema, invece di fondamentalmente la pubblicazione di un enorme blocco di codice e chiedere alla gente di capire cosa non va e risolvere il problema.

 

2 Replies
  1. 47

    Non paralizzare voi stessi di parsing HTML con espressioni! Invece, lasciare che un parser HTML libreria di preoccuparsi per la struttura di markup per voi.

    Vi suggerisco di controllare Semplice HTML DOM (http://simplehtmldom.sourceforge.net/). Si tratta di una libreria, scritto appositamente per l’aiuto nella risoluzione di questo tipo di web scraping problemi in PHP. Utilizzando una libreria, è possibile scrivere il vostro scraping in meno righe di codice senza preoccuparsi del lavoro espressioni.

    In linea di principio, con il Semplice HTML DOM basta scrivere qualcosa come:

    $html = file_get_html('http://flow935.com/playlist/flowhis.HTM');
    foreach($html->find('tr') as $row) {
       //Parse table row here
    }

    Questo può essere poi esteso a catturare i vostri dati in un certo formato, per esempio per creare una serie di artisti e corrispondenti titoli come:

    <?php
    require('simple_html_dom.php');
    
    $table = array();
    
    $html = file_get_html('http://flow935.com/playlist/flowhis.HTM');
    foreach($html->find('tr') as $row) {
        $time = $row->find('td',0)->plaintext;
        $artist = $row->find('td',1)->plaintext;
        $title = $row->find('td',2)->plaintext;
    
        $table[$artist][$title] = true;
    }
    
    echo '<pre>';
    print_r($table);
    echo '</pre>';
    
    ?>

    Possiamo vedere che questo codice può essere (banalmente) modificato per riformattare i dati in qualsiasi altro modo.

    • Che ha funzionato perfettamente. Ma ho bisogno di fare un array multidimensionale, come mostrato in fondo la domanda originale.
    • Fatto il check out esempio “Raschiare Slashdot!” dal simplehtmldom sito? Da quanto ho capito è la risposta a questa domanda.
    • Ok ho aggiunto un ulteriore esempio, ma questo è quanto ne andrà. Vorrei lasciare il resto per voi capire.
    • Sì, ho capito. Grazie per l’ulteriore esempio.
    • Utilizzando simplehtmldom invece di rexexps è divertente, non è vero? 🙂
    • Sì, e il codice è più leggibile troppo. Grazie ancora 😀
    • bellissimo codice :)…
    • Che cosa succede se la tabella html è impaginato ?

  2. 18

    Ho provato simple_html_dom ma di grandi dimensioni, i file e ripetere le chiamate alla funzione che io sto zend_mm_heap_corrupted su php 5.3 (GAH). Ho provato anche preg_match_all (ma questo è stato un fallimento su un file di grandi dimensioni (5000) righe di codice html, che era solo di circa 400 righe della mia tabella HTML.

    Sto usando questo e il suo funzionamento veloce e non sputare errori.

    $dom = new DOMDocument();  
    
    //load the html  
    $html = $dom->loadHTMLFile("htmltable.html");  
    
      //discard white space   
    $dom->preserveWhiteSpace = false;   
    
      //the table by its tag name  
    $tables = $dom->getElementsByTagName('table');   
    
    
        //get all rows from the table  
    $rows = $tables->item(0)->getElementsByTagName('tr');   
      //get each column by tag name  
    $cols = $rows->item(0)->getElementsByTagName('th');   
    $row_headers = NULL;
    foreach ($cols as $node) {
        //print $node->nodeValue."\n";   
        $row_headers[] = $node->nodeValue;
    }   
    
    $table = array();
      //get all rows from the table  
    $rows = $tables->item(0)->getElementsByTagName('tr');   
    foreach ($rows as $row)   
    {   
       //get each column by tag name  
        $cols = $row->getElementsByTagName('td');   
        $row = array();
        $i=0;
        foreach ($cols as $node) {
            # code...
            //print $node->nodeValue."\n";   
            if($row_headers==NULL)
                $row[] = $node->nodeValue;
            else
                $row[$row_headers[$i]] = $node->nodeValue;
            $i++;
        }   
        $table[] = $row;
    }   
    
    var_dump($table);

    Questo codice ha funzionato bene per me.
    Esempio di codice originale è qui.

    http://techgossipz.blogspot.co.nz/2010/02/how-to-parse-html-using-dom-with-php.html

    • sì, il suo lavoro per me! 🙂 🙂
    • si dovrebbe fare array_shift($tabella) perché il primo elemento [0] => array(0) { } vuota. è perché si ottiene tutti i tag tr a $righe di cui uno con tag th. Vorrei suggerire una modifica.
    • Io sto usando il DOM con PHP 5.6.31, ma ha scoperto che il risultato di $rows = $tables->item(0)->getElementsByTagName('tr') non contiene <td> tag per una successiva $cols = $row->getElementsByTagName('td'). Un’idea del perché la mia prima chiamata a getElementsByTagName() sembra essere nudo i tag HTML?

Lascia un commento