Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to extracting Data from HTML table using php

Tags:

html

dom

php

xpath

I keep trying different methods of extracting the data from the HTML table such as using xpath. The table(s) do not contain any classes so I am not sure how to use xpath without classes or Id. This data is being retrieved from an rss xml file. I am currently using DOM. After I extract the data, I will try to sort, the tables by Job Title

Here is my php code

$html='';
$xml= simplexml_load_file($url) or die("ERROR: Cannot connect to url\n check if report still exist in the Gradleaders system");

/*What we do here in this loop is retrieve all content inside the encoded content, 
*which includes the CDATA information. This is where the HTML and styling is included.
*/

foreach($xml->channel->item as $cont){
    $html=''.$cont->children('content',true)->encoded.'<br>';   //actual tag name is encoded 
}

$htmlParser= new DOMDocument();     //to parse html using DOMDocument
libxml_use_internal_errors(true);   // your HTML gives parser warnings, keep them internal
$htmlParser->loadHTML($html);       //Loaded the html string we took from simple xml

$htmlParser->preserveWhiteSpace = false;
$tables= $htmlParser->getElementsByTagName('table');
$rows= $tables->item(0)->getElementsByTagName('tr');

foreach($rows as $row){
    $cols = $row->getElementsByTagName('td');
    echo $cols;
}

This is the HTML I am extracting info from

<table cellpadding='1' cellspacing='2'>
  <tr>
    <td><b>Job Title:</b></td>
    <td>Job Example </td>
  </tr>
  <tr>
    <td><b>Job ID:</b></td>
    <td>23992</td>
  </tr>
  <tr>
    <td><b>Job Description:</b></td>
    <td>Just a job example </td>
  </tr>
  <tr>
    <td><b>Job Category:</b></td>
    <td>Work-study Position</td>
  </tr>
  <tr>
    <td><b>Position Type:</b></td>
    <td>Work-study</td>
  </tr>
  <tr>
    <td><b>Applicant Type:</b></td>
    <td>Work-study</td>
  </tr>
  <tr>
    <td><b>Status:</b></td>
    <td>Active</td>
  </tr>
  <tr>
    <td colspan='2'><b><a href='https://www.myjobs.com/tuemp/job_view.aspx?token=I1iBwstbTs2pau+SjrYfWA%3d%3d'>Click to View More</a></b></td>
  </tr>
</table>
like image 254
Jose Ortiz Avatar asked May 13 '16 17:05

Jose Ortiz


1 Answers

You can use xpath to query('//td') and retrieve the td html using C14N(), something like:

$dom = new DOMDocument();
$dom->loadHtml($html);
$x = new DOMXpath($dom);
foreach($x->query('//td') as $td){
    echo $td->C14N();
    //if just need the text use:
    //echo $td->textContent;
}

Output:

<td><b>Job Title:</b></td>
<td>Job Example </td>
<td><b>Job ID:</b></td>
...

C14N();

Returns canonicalized nodes as a string or FALSE on failure


Update:

Another question, how can I grab individual Table Data? For example, just grab, Job ID

Use XPath contains, i.e.:

foreach($x->query('//td[contains(., "Job ID:")]') as $td){
    echo $td->textContent;
}

Update V2:

How can I get the next Table Data after that (to actually get the Job Id) ?

Use following-sibling::*[1], i.e:

echo $x->query('//td[contains(*, "Job ID:")]/following-sibling::*[1]')->item(0)->textContent;
//23992
like image 176
Pedro Lobito Avatar answered Sep 30 '22 01:09

Pedro Lobito