2

次のように終了するcurlスクリプトがあります。

  $data = curl_exec($ch);

  curl_close($ch);

  return $data;

}

$data 文字列は、データをMYSQLデータベースに保存できるように削除したいテーブルを含むHTMLページです。次のようなコマンドで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);

テーブルの行をフェッチする前に、少なくとも 1 つのテーブルが見つかっていることを確認する必要があります。

$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 に答える