试图从网站上的表中抓取数据。我编写了以下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";
}
}