使用SimpleHTMLDOM循环遍历一个表


Loop through a table with Simple HTML DOM

试图从网站上的表中抓取数据。我编写了以下PHP,但它不起作用。

收到以下错误:注意:试图在第27行的DataScraping.php中获取非对象的属性

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

同样值得一提的是,这些数据是公开的,仅供个人使用。请不要评论侵犯版权-我想做的没有错。

我只是想刮取航班号,包括内部文本和后面的网址。有什么帮助吗?

额外的测试提供了我需要的数据,但在行之间出现了相同的错误:

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

您正试图访问if语句本身中的null引用元素,因为并非所有<TD>标记中都有<A>标记。当$td中没有<A>标签时,$td->find('a', 0)为空,因此

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

正是您的错误消息所说的:"正在尝试获取非对象的属性"。

您可以通过使用if:检查find()的结果是否为null来解决此问题

$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";
    }           
}