如何使用PHP刮取HTML表数据

如何使用PHP刮取HTML表数据,php,html,Php,Html,编辑:没有说清楚。我正在使用PHP 我正在尝试创建一个现代化的Boxrec网站,我正在从维基百科中收集数据。在每一个拳击手的维基百科页面上,他们都有一张他们的比赛表格。我已经成功地从另一个表中提取了赢、输和抽数据。如何使用PHP将战斗表数据提取到某种纯文本(2D?)数组中 这是一个表的链接(第二个表,较大的一个) 这是我尝试过的代码(我可能完全不喜欢这个) 这给了我 警告:DOMDocument::loadHTML():意外的结束标记:实体中的div, 第38行C:\xampp\htdocs\

编辑:没有说清楚。我正在使用PHP

我正在尝试创建一个现代化的Boxrec网站,我正在从维基百科中收集数据。在每一个拳击手的维基百科页面上,他们都有一张他们的比赛表格。我已经成功地从另一个表中提取了赢、输和抽数据。如何使用PHP将战斗表数据提取到某种纯文本(2D?)数组中

这是一个表的链接(第二个表,较大的一个)

这是我尝试过的代码(我可能完全不喜欢这个)

这给了我

警告:DOMDocument::loadHTML():意外的结束标记:实体中的div, 第38行C:\xampp\htdocs\boxing\search\index.php中的第4375行


我看到几个问题:

  • $tables->item(1)->getElementsByTagName('tr')
    将始终为您提供页面中的第二个表,即右侧Personal stats块中的表
  • 由于
    $cols[2]
    不是简单类型的对象,因此您将收到警告,而不是内容。使用
    echo$cols[2]->textContent
    输出内部文本
  • 如果要分析结果表,我建议加载所有表,然后根据结果表中不同的表标题进行检查。然后提取相应的列

    示例代码:

    下面的代码仅显示如何检查表中的示例标题“Result”,然后将输出results列。请根据你想要的目的调整它

    <?php
    $table = file_get_contents('https://en.wikipedia.org/wiki/Sugar_Ray_Robinson');
    
    $dom = new DOMDocument;
    
    $dom->loadHTML($table);
    $dom->preserveWhiteSpace = false;
    $tables = $dom->getElementsByTagName('table');
    
    foreach ($tables as $singleTable) {
        try {
            $rows = $singleTable->getElementsByTagName('tr');
            // check if we are parsing the right table:
            $row1= $rows[0]->getElementsByTagName('th');
            
            $isResultTable= FALSE;
            foreach ($row1 as $th) {
                if (trim($th->textContent) === 'Result') {
                    $isResultTable = TRUE;
                }
            }
            
            if (!$isResultTable) continue;
            
            foreach ($rows as $row) {   
                $cols = $row->getElementsByTagName('td');
                echo $cols[2]->textContent;
            }       
        } catch (Exception $ex) {
            print_r($ex);
        }
    }
    

    我发现了几个问题:

  • $tables->item(1)->getElementsByTagName('tr')
    将始终为您提供页面中的第二个表,即右侧Personal stats块中的表
  • 由于
    $cols[2]
    不是简单类型的对象,因此您将收到警告,而不是内容。使用
    echo$cols[2]->textContent
    输出内部文本
  • 如果您正在分析结果表,我建议加载所有表,然后根据结果表中不同的表标题进行检查。然后提取相应的列

    示例代码:

    下面的代码仅显示如何检查表中的示例标题“Result”,然后将输出results列。请根据你想要的目的调整它

    <?php
    $table = file_get_contents('https://en.wikipedia.org/wiki/Sugar_Ray_Robinson');
    
    $dom = new DOMDocument;
    
    $dom->loadHTML($table);
    $dom->preserveWhiteSpace = false;
    $tables = $dom->getElementsByTagName('table');
    
    foreach ($tables as $singleTable) {
        try {
            $rows = $singleTable->getElementsByTagName('tr');
            // check if we are parsing the right table:
            $row1= $rows[0]->getElementsByTagName('th');
            
            $isResultTable= FALSE;
            foreach ($row1 as $th) {
                if (trim($th->textContent) === 'Result') {
                    $isResultTable = TRUE;
                }
            }
            
            if (!$isResultTable) continue;
            
            foreach ($rows as $row) {   
                $cols = $row->getElementsByTagName('td');
                echo $cols[2]->textContent;
            }       
        } catch (Exception $ex) {
            print_r($ex);
        }
    }
    

    编辑的原始帖子看起来您的HTML无效:
    DOMDocument::loadHTML():意外的结束标记…
    只是想跟进一下:您有机会尝试发布的代码吗?非常好,非常感谢您编辑的原始帖子看起来您的HTML无效:
    DOMDocument::loadHTML():意外的结束标记…
    只是为了跟进:您有机会尝试发布的代码吗?工作非常好,非常感谢