使用DOM从第二个HTML表中提取数据,忽略第一个表

时间:2015-11-11 11:40:46

标签: javascript php html

我有以下PHP脚本,它通过命令提示符运行,如果页面上只有一个表,但如果我在页面上有两个表,它只会尝试拉出第一个表,它是正常的,是在某些情况下,我可以说忽略第一个表并仅处理第二个表吗?

我无法控制HTML,因此无法使用ID定位表。

HTML

<html>
</head>
...
</head>
<body>
    <table>
        <tr>
            <th>Problem Table</th>
        </tr>
        <tr>
            <td>Annoying table in the way!</td>
        </tr>
    </table>
    <hr/>
    <table>
        <tr>
            <th>ID</th>
            <th>Asset</th>
        </tr>
        <tr>
            <td>34234234</td>
            <td>Website3</td>
        </tr>
        <tr>
            <td>34234234</td>
            <td>Website4</td>
        </tr>
    </table>
</body>
</html>

PHP

$dom = new DOMDocument();
$html = $dom->loadHTMLFile($url);

$dom->preserveWhiteSpace = false;

$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(0)->getElementsByTagName('tr');
$cols = $rows->item(0)->getElementsByTagName('th');
$row_headers = null;

foreach($cols AS $node) {
    $row_headers[] = $node->nodeValue;
}

$table = array();
$rows = $tables->item(0)->getElementsByTagName('tr');
foreach($rows AS $row) {
    $cols = $row->getElementsByTagName('td');
    $row = array();
    $i = 0;
    foreach($cols AS $node) {
        if ($row_headers != null) {
            $row[$row_headers[$i]] = $node->nodeValue;
        }
        $i++;
    }
    if (!empty($row)) {
        $table[] = $row;
    }
}

2 个答案:

答案 0 :(得分:1)

我同意@ GCC404你应该使用ID或类更好地定位你的元素,因为这很容易导致错误。

但是,如果您特别想要定位最后一个表,则只需将0替换为找到的项目数减去1:

$rows = $tables->item( $tables->length - 1 )->getElementsByTagName('tr');
// etc.

答案 1 :(得分:-1)

使用getElementsByTagName()时,您可以使用DOMNodelist::item指定索引。

这应该只在您无法控制源HTML时使用,或者您确定总会有两个表,但我建议您只要为每个表设置一个id / class的HTML。

$dom = new DOMDocument();
$html = $dom->loadHTMLFile($url);

$dom->preserveWhiteSpace = false;

$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(1)->getElementsByTagName('tr');
$cols = $rows->item(1)->getElementsByTagName('th');
$row_headers = null;

foreach($cols AS $node) {
    $row_headers[] = $node->nodeValue;
}

$table = array();
$rows = $tables->item(1)->getElementsByTagName('tr');
foreach($rows AS $row) {
    $cols = $row->getElementsByTagName('td');
    $row = array();
    $i = 0;
    foreach($cols AS $node) {
        if ($row_headers != null) {
            $row[$row_headers[$i]] = $node->nodeValue;
        }
        $i++;
    }
    if (!empty($row)) {
        $table[] = $row;
    }
}