简单的HTML DOM - 遍历html

时间:2013-08-23 15:49:01

标签: php dom simple-html-dom tree-traversal

我正在使用Simple HTML DOM Parser - http://simplehtmldom.sourceforge.net/manual.htm 我正试图从记分牌页面抓取一些数据。下面的示例显示了我拉出“Akron Rushing”表格的HTML。

$tr->find('td', 0)内,第一列,有一个超链接。如何提取此超链接?使用$tr->find('td', 0')->find('a')似乎不起作用。

另外:我可以为每个表写入条件(传递,冲,接收等),但是有更有效的方法吗?我对这个想法持开放态度。

include('simple_html_dom.php');
$html = file_get_html('http://espn.go.com/ncf/boxscore?gameId=322432006');

$teamA['rushing'] = $html->find('table.mod-data',5);

foreach ($teamA as $type=>$data) {
  switch ($type) {
    # Rushing Table
    case "rushing":
       foreach ($data->find('tr') as $tr) {
        echo $tr->find('td', 0);    // First TD column (Player Name)
        echo $tr->find('td', 1);    // Second TD Column (Carries)
        echo $tr->find('td', 2);    // Third TD Column (Yards)
        echo $tr->find('td', 3);    // Fourth TD Column (AVG)
        echo $tr->find('td', 4);    // Fifth TD Column (TDs)
        echo $tr->find('td', 5);    // Sixth TD Column (LGs)
        echo "<hr />";
        }
   }
}

2 个答案:

答案 0 :(得分:3)

在您的情况下,find('tr')会返回10个元素而不是仅预期的7个行。

此外,并非所有名称都有与之关联的链接,尝试在不存在时检索链接可能会返回错误。

因此,这是您的代码的修改工作版本:

$url = 'http://espn.go.com/ncf/boxscore?gameId=322432006';

$html = file_get_html('http://espn.go.com/ncf/boxscore?gameId=322432006');

$teamA['rushing'] = $html->find('table.mod-data',5);

foreach ($teamA as $type=>$data) {
  switch ($type) {
    # Rushing Table
    case "rushing":
        echo count($data->find('tr')) . " \$tr found !<br />";

        foreach ($data->find('tr') as $key => $tr) {

            $td = $tr->find('td');

            if (isset($td[0])) {
                echo "<br />";
                echo $td[0]->plaintext . " | ";         // First TD column (Player Name)

                // If anchor exists
                if($anchor = $td[0]->find('a', 0))
                    echo $anchor->href;                 // href

                echo " | ";

                echo $td[1]->plaintext . " | ";     // Second TD Column (Carries)
                echo $td[2]->plaintext . " | ";     // Third TD Column (Yards)
                echo $td[3]->plaintext . " | ";     // Fourth TD Column (AVG)
                echo $td[4]->plaintext . " | ";     // Fifth TD Column (TDs)
                echo $td[5]->plaintext;             // Sixth TD Column (LGs)
                echo "<hr />";
            }

        }
   }
}

如您所见,可以使用此格式$tag->attributeName来重新调整属性。在您的情况下,attributeNamehref

说明:

处理find的错误是个好主意,知道在找不到任何内容时返回“False”

$td = $tr->find('td');

// Find suceeded
if ($td) {
    // code here
}
else
  echo "Find() failed in XXXXX";

PHP简单的HTML DOM解析器已经知道php5的内存泄漏问题,因此不要忘记在不再使用DOM对象时释放内存:

$html = file_get_html(...);

// do something... 

$html->clear(); 
unset($html);

Source: http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak

答案 1 :(得分:-1)

根据文档,您应该能够为嵌套元素链接选择器。

这是他们给出的例子:

// Find first <li> in first <ul>    
$e = $html->find('ul', 0)->find('li', 0);

我能看到的唯一区别是它们在第二个查找中包含索引。尝试添加,并查看它是否适合您。