PHP - DOM,从html中剥离表

时间:2012-12-18 02:15:12

标签: html dom strip php

我有一个像这样结束的卷曲脚本:

  $data = curl_exec($ch);

  curl_close($ch);

  return $data;

}

$ data字符串它是一个带有表的HTML页面,我想要删除它以便我可以将数据存储到MYSQL数据库中,我尝试使用带有以下命令的DOM:

  // new dom object
  $dom = new DOMDocument();

  //load the html
  $html = str_get_html($returned_content2);
   $dom->strictErrorChecking = false;


  //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'); 

  // loop over the table rows
  foreach ($rows as $row) 
  { 
   // get each column by tag name
      $cols = $row->getElementsByTagName('td'); 
   // echo the values  
      echo $cols->item(0)->nodeValue.'<br />'; 
      echo $cols->item(1)->nodeValue.'<br />'; 
      echo $cols->item(2)->nodeValue;
    } 
}

但不断收到错误:

  

致命错误:在第178行的/home/sdsd/dfdsfsdfds/sdfsdfs/table.php中的非对象上调用成员函数getElementsByTagName()

2 个答案:

答案 0 :(得分:4)

您根本没有将HTML加载到DOMDocument中。删除此行

  

$ html = str_get_html($ returned_content2);

并将其放在preserveWhiteSpace

之后
$dom->loadHTML($returned_content2);

在尝试获取表格行之前,您应确保至少找到一个表格,例如

$tables = $dom->getElementsByTagName('table');
if ($tables->length == 0) {
    throw new Exception('No tables found');
}

答案 1 :(得分:1)

这是相当微不足道的:

//get all rows from the table
$rows = $tables->item(0)->getElementsByTagName('tr'); 
                 ^^^^^^^

当文档没有表格(例如,因为您没有加载任何内容时为空文档)时,->item(0)会返回NULL。值NULL没有getElementsByTagName方法(它甚至不是对象),因此您会看到错误消息。

每当您执行重要操作(或遇到错误)时,请执行所需的前置条件检查。 E.g:

$tables = $dom->getElementsByTagName('table');
if (!$tables->length) {
    throw new UnexpectedValueException('Table expected but not found.');
}