2016-05-15 5 views
1

Versuchen, Daten aus einer Tabelle auf einer Website zu scrappen. Ich habe das folgende PHP geschrieben, aber es funktioniert nicht.Durchlaufen einer Tabelle mit Simple HTML DOM

Nach Fehler empfangen: Hinweis: Der Versuch 27 Eigenschaft von Nicht-Objekt in DataScraping.php auf Linie zu bekommen

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

      }   
     } 
    } 
} 

Ebenfalls erwähnenswert, diese Daten öffentlich verfügbar ist, und es ist nur für den persönlichen Gebrauch . Bitte kommentieren Sie keine Urheberrechtsverletzungen - es ist nichts falsch daran, was ich tun möchte.

Ich versuche nur die Flugnummer nur zu kratzen, sowohl den inneren Text als auch die URL, die dahintersteckt. Irgendwelche Hilfe, wo ich falsch liege?

Zusätzliche Test liefert die Daten, die ich brauche, aber mit dem gleichen Fehler in zwischen den Reihen:

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

Al richtig, also welche dieser Linien ist Linie 27? –

+0

Das Echo nach der if-Anweisung. – DARKOCEAN

+0

Ich bin überrascht, dass die if-Anweisung wahr bewertet (aber es muss, wenn Sie diesen Fehler sehen); Wenn ich die Quelle dieser Seite ansehe, sind die hrefs alle relativ. Vielleicht verstehe ich nicht, wie SimpleHTMLDOM funktioniert. –

Antwort

0

Sie versuchen, sich if Anweisung in der Elemente einer Nullreferenz zuzugreifen, weil nicht alle der <TD> Tags haben <A> Tags in ihnen. Wenn es in $td kein <A> Tag ist, $td->find('a', 0) null ist, so

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

genau das, was Nachricht, sagte Ihr Fehler ist: "versuchen, erhalten [a] Eigenschaft [a] Nicht-Objekt".

Sie können dieses Problem beheben, indem das Ergebnis von find() für null mit einem if Überprüfung:

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

Und Sie können mit dem && Operator diese in Ihre einzige if Aussage falten. Sie haben noch ein paar Probleme habe ich gefunden, wenn Ihr Code ausgeführt wird:

  • in der Quelle dieser Website, die hrefs in der Tabelle alle relativ sind, nicht absolut, also, wenn Sie für 'https://www.flightradar24.com' überprüfen finden Sie keiner von ihnen
  • Sie sind nicht so eine neue Zeile am Ende Ihrer echo

zusammenzufassen meiner Vorschläge, so etwas wie dies scheint zu funktionieren und fügen hinzu:

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

Danke für Ihren Vorschlag. Ich habe das Problem mit den hrefs bemerkt, das ich in meiner aktualisierten Version geändert habe. Gute Stelle! Es ist merkwürdig, wie ich das schon früher in VBA gemacht habe, was die gesamte URL und nicht nur einen Teil davon vom selben html-Element anzeigt. – DARKOCEAN

Verwandte Themen