2016-05-15 10 views
1

ウェブサイト上のテーブルからデータを掻き取ろうとしています。次のようなPHPが書かれていますが、動作しません。シンプルなHTML DOMを使用してテーブルをループする

次のエラーが受信:お知らせ:ライン上DataScraping.phpで非オブジェクトのプロパティを取得しようとすると27

また
//Sets the HTML DOM Library 
require_once 'C:/xampp/php/lib/SimpleHTMLDOM/simple_html_dom.php'; 

$html = new simple_html_dom(); 
$html = file_get_html('https://www.flightradar24.com/data/flights/british-airways-ba-baw'); 

foreach($html->find('table[id=tbl-datatable]') as $datatable) { 

    foreach($datatable->find('tr') as $tr) { 

     foreach($tr->find('td') as $td) { 

      if(strpos($td->find('a', 0)->href, 'https://www.flightradar24.com/data/flights/') !== false) { 

       echo $td->find('a', 0)->innertext .", " .$td->find('a', 0)->href; 

      }   
     } 
    } 
} 

、このデータは一般に公開され、それは個人的な使用のためだけでは言及する価値。著作権侵害についてはコメントしないでください。私がしたいことには何も問題はありません。

私は、フライトナンバーだけを掻き取ろうとしています。内側のテキストとその背後にあるサイトのURLの両方を削っています。私が間違っている場所の助け?

追加のテストでは、私は必要なデータを提供しますが、行の間で同じエラーを持つ:

foreach($html->find('table[id=tbl-datatable]') as $datatable) { 

    foreach($datatable->find('tr') as $tr) { 

     foreach($tr->find('td') as $td) { 

      if (strpos($td->find('a', 0)->href, '/data/flights/') !== false) { 

       $test = $td->find('a', 0)->href; 
       $test2 = $td->find('a', 0)->innertext; 
       echo $test .", " .$test2; 

      }  
     } 
    } 
} 
+0

アルそうです、その行のどれが27行ですか? –

+0

if文の後のエコー。 – DARKOCEAN

+0

ifステートメントがtrueを評価するのは驚きです(しかし、そのエラーが表示されていなければなりません)。私がそのページのソースを見ると、hrefsはすべて相対的です。たぶん、SimpleHTMLDOMのしくみを理解していないかもしれません。 –

答えて

0

あなたのif文自体にnull参照の要素にアクセスしようとしている、なぜならすべてではない<TD>のタグには<A>タグが含まれています。 「[A]非オブジェクトの[A]プロパティを取得しようとしている」:$tdには<A>タグ、$td->find('a', 0)がnullではありません場合は、その

$td->find('a', 0)->href 

はあなたのエラーメッセージが言っただけのものです。

あなたはifにnullをfind()の結果を確認することでこの問題を解決することができます

$atag = $td->find('a', 0) 
if ($atag) { 
    // ... 
} 

をそして、あなたは&&演算子を使用して、単一のifの文にこれを折り畳むことができます。テーブル内のhrefはすべて絶対的、相対的ではありませんので、あなたが'https://www.flightradar24.com'をチェックするときに、それらのどれを見つけていない、そのサイトのソースに

  • :あなたはあなたのコードを実行するときに私が見つけた別のカップルの問題を持っています
  • あなたはだから私の提案をまとめるために、このような何かが動作しているようですあなたのecho

の末尾に改行を追加していない:

foreach($tr->find('td') as $td) { 
    $atag = $td->find('a', 0); 
    if($atag && strpos($atag->href, '/data/flights/') !== false) { 
     echo $atag->innertext . ", " . $atag->href . "\n"; 
    }   
} 
+0

あなたの提案をありがとう。私は、更新されたバージョンで修正されたhrefsの問題に気付きました。良い点!これは以前、VBAでこれを行ったように、奇妙です。同じhtml要素から、URLの一部だけでなく、全体が表示されます。 – DARKOCEAN

関連する問題