Parse html table using file_get_contents to php array Parse html table using file_get_contents to php array php php

Parse html table using file_get_contents to php array


Don't cripple yourself parsing HTML with regexps! Instead, let an HTML parser library worry about the structure of the markup for you.

I suggest you to check out Simple HTML DOM (http://simplehtmldom.sourceforge.net/). It is a library specifically written to aid in solving this kind of web scraping problems in PHP. By using such a library, you can write your scraping in much less lines of codes without worrying about creating working regexps.

In principle, with Simple HTML DOM you just write something like:

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

This can be then extended to capture your data in some format, for instance to create an array of artists and corresponding titles as:

<?phprequire('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>';?>

We can see that this code can be (trivially) changed to reformat the data in any other way as well.


I tried simple_html_dom but on larger files and on repeat calls to the function I am getting zend_mm_heap_corrupted on php 5.3 (GAH). I have also tried preg_match_all (but this has been failing on a larger file (5000) lines of html, which was only about 400 rows of my HTML table.

I am using this and its working fast and not spitting errors.

$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);

This code worked well for me.Example of original code is here.

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