【问题标题】:How to scrape HTML table data using PHP如何使用 PHP 抓取 HTML 表格数据
【发布时间】:2020-06-24 10:48:34
【问题描述】:

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

我正在尝试制作一个现代化的 Boxrec 网站,我正在从 Wikipedia 抓取数据。在拳击手的每个维基百科页面中,他们都有一张他们的战斗表。我已经成功地从不同的表中提取了胜利、失败和平局数据。我将如何使用 PHP 将战斗表数据提取到某种(2D?)纯文本数组中?

这是表的链接(这是第二张表,较大的那张) https://en.wikipedia.org/wiki/Sugar_Ray_Robinson#Professional_boxing_record

这是我尝试过的代码(我可能完全不同意)

$dom = new domDocument;

$dom->loadHTML($table);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');

$rows = $tables->item(1)->getElementsByTagName('tr');

foreach ($rows as $row) {
        $cols = $row->getElementsByTagName('td');
        echo $cols[2];
}

这给了我

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

【问题讨论】:

  • 编辑过的原帖
  • 看起来您的 HTML 无效:DOMDocument::loadHTML(): Unexpected end tag ...
  • 只是跟进:您有机会尝试发布的代码吗?
  • 完美运行,非常感谢

标签: php html


【解决方案1】:

我看到的几个问题:

  1. $tables->item(1)->getElementsByTagName('tr'); 将始终为您提供页面中的第二个表格,即右侧“个人统计信息”块中的表格
  2. 由于$cols[2] 不是简单类型的对象,您将收到警告而不是内容。使用echo $cols[2]->textContent输出内文。

如果您正在解析结果表,我建议加载所有表,然后根据结果表中不同的表标题进行检查。然后提取相应的列。

示例代码:

以下代码仅显示如何检查表中的示例标题“结果”,然后将输出结果列。请根据您想要的目的进行调整。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 2016-01-31
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多