【问题标题】:PHP's DOMXpath fails to return the complete set of children nodesPHP 的 DOMXpath 无法返回完整的子节点集
【发布时间】:2013-05-17 15:10:01
【问题描述】:

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

<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');

不幸的是,没有返回完整的表行集——只有前三个。我猜想空元素&lt;td&gt;&lt;/td&gt; 会以某种方式抛弃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->length 为 3,这与输出一致,但与具有 9 行的标记不一致。

【问题讨论】:

  • 不确定这是转录错误还是代码拼写错误,但上面的表类是东西而不是东西。其次,我得到 8 个 //tr 结果与该查询就好了吗?
  • 您的 XPath 完全没问题。之后的 PHP 代码是什么?可能问题就在那里。
  • 可能是我正在抓取一个标记错误的网页并且正在抛出 DOMDocument
  • 完整的页面会很有帮助。一个很小的可能性是你的显示程序让你失望了?尝试遍历 $tableRows: foreach( $tableRows as $row ) { echo "{$row->nodeName}\n"; }
  • 在将“something”更正为“something”后似乎正在工作:codepad.viper-7.com/vCiisu

标签: php xpath


【解决方案1】:

我正在抓取包含无效、损坏、脏 HTML 的网页。 DOMDocument 喜欢干净和有条理(我猜)。相反,我使用 simple_html_dom.php 脚本来解析 HTML,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多