PHP DOMXpath无法返回完整的子节点集

时间:2013-05-17 15:10:01

标签: php xpath

当我使用DOMXpath查询顶级节点时,我有9个表行,但只返回了三个。

<table class="something">
    <tbody>
        <tr>
            <td class="label">One</td>
            <td>111111</td>
        </tr>
        <tr>
            <td class="label">Two</td>
            <td>1454</td>
        </tr>    
        <tr>
            <td class="label">Three</td>
            <td></td>
        </tr>
        <tr>
            <td class="label">Four</td>
            <td>0</td>
        </tr>
        <tr>
            <td class="label">Five</td>
            <td>45</td>
        </tr>
        <tr>
            <td class="label">Six</td>
            <td>45</td>
        </tr>
        <tr>
            <td class="label">Seven</td>
            <td>5</td>
        </tr>
        <tr>
            <td class="label">Eight</td>
            <td>0</td>
        </tr>
        <tr>
            <td class="label">Nine</td>
            <td>0</td>
        </tr>
    </tbody>
</table>

我使用DOMDocument加载HTML。

$doc = new DOMDocument;
@$doc->loadHTML($htmlData);
$xpath = new DOMXpath($doc);
$tableRows = $xpath->query('//table[@class="something"]//tr');

不幸的是,没有返回完整的表行集 - 只有前三行。我猜这个空元素<td></td>以某种方式抛弃了xpath解析器。有解决方案吗?

编辑:

我正在尝试不使用DOMXpath的另一种方法。

    $request = drupal_http_request($url);

    $data = $request->data;

    $doc = new DOMDocument;
    @$doc->loadHTML($data);
    $tables = $doc->getElementsByTagName('table');
    $rows = $tables->item(2)->getElementsByTagName('tr');
    $output = '';
    foreach($rows as $row) {
        $cols = $row->getElementsByTagName('td');
        foreach($cols as $col){
            $output .= $col->nodeValue . '<br/>';
        }
    }
    return $output;

两种方法都输出此HTML:

<div class="content">
    One<br>111111<br>Two<br>1454<br>Three<br><br>
</div>

在第一个示例中,$ tableRows-&gt;长度为3,与输出一致,但不包含9行的标记。

1 个答案:

答案 0 :(得分:0)

我正在抓取一个包含无效,损坏,脏的HTML的网页。 DOMDocument喜欢整洁有序(我猜)。相反,我使用simple_html_dom.php脚本来解析HTML,它运行正常。