2

我有一个这样结束的 curl 脚本:

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

4

2 回答 2

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');
}
于 2012-12-18T02:22:18.733 回答
1

这是相当微不足道的:

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

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

每当您做一些重要的事情(或遇到错误)时,请进行必要的前置条件检查。例如:

$tables = $dom->getElementsByTagName('table');
if (!$tables->length) {
    throw new UnexpectedValueException('Table expected but not found.');
}
于 2012-12-18T02:23:51.887 回答