使用Simple HTML DOM遍历表

时间:2016-05-15 11:28:05

标签: php dom web-scraping

尝试从网站上的表格中删除数据。我得到了以下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;

            }           
        }
    }
}

另外值得一提的是,这些数据是公开的,仅供个人使用。请不要对版权侵权发表评论 - 我想做的事情没有错。

我只是试图仅搜索航班号,包括内部文本和后面站点的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;

            }       
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您尝试在if语句中访问空引用的元素,因为并非所有<TD>标记都包含<A>个标记。如果<A>中没有$td标记,$td->find('a', 0)为空,那么

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

正是您的错误消息所说的:“试图获得[a]非对象的[a]属性。”

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

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

您可以使用if运算符将其折叠到单个&&语句中。您在运行代码时遇到了另外几个问题:

  • 在该网站的来源中,表格中的hrefs都是相对的,而不是绝对的,所以当你检查'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";
    }           
}